2015-12-26 3 views
2

Предположим, у меня есть следующая строка:В UNIX, как вы могли найти одно слово в длинной строке?

mystring="something something something schwifty3 something" 

теперь я знаю, что Theres в schwifty с номером после него, но я хочу все слова из этой строки все остальное исключено.

grep -o, по-видимому, не работает или даже не подходит для использования по какой-либо причине ... любые идеи?

ответ

3

Для чистого подхода оболочки, строка подстановки с префиксом (#) и суффикс (%) удаление будет работать:

mystring="something something something schwifty3 something" 

s=schwifty 

case $mystring in 
(*$s*) 
    a="$s${mystring#*$s}" 
    echo ${a%% *} 
esac 

Это покажет первое вхождение любой строки, начиная с $s в $mystring. Предположение: вы разделите строку только на пространстве ascii.

Подход с чистым корпусом означает, что мы просто используем встроенные оболочки и механики, а не внешние команды.

4

Переведите пробелы в разрывы строк, чтобы grep возвращал только одно слово.

mystring="something something something schwifty3 something" 
echo "$mystring" | tr " " '\n' | grep "schwifty" 
+0

Я буду использовать это навсегда. Спасибо, это прекрасно! – driedupsharpie

1

-w для слова в Grep

echo sth sth something sth1|sed 's/ /\n/g'|grep -w sth 
sth 
sth 
3

насчет

grep -Po "schwifty\d" <<< $mystring 

или это, если есть, может быть, больше, чем одна цифры в строке:

grep -Po "schwifty\d+" <<< $mystring 
0
$ echo $mystring 
something something something schwifty3 something 

$ echo $mystring | sed -n 's/.*\s*\(schwifty[0-9]\)\s*.*/\1/p' 
schwifty3 

$ echo $mystring | sed -n 's/.*\s*\(schwifty\)[0-9]\s*.*/\1/p' 
schwifty 
0

вы также можете сделать это в bash.

a=" $mystring "  # pad with spaces (in-case the word is first or last) 
a="${a#* schwifty}" # chop all before and including schwifty 
a="schwifty${a%% *}" # restore schwifty chop all after first word, 
echo "$a"