2015-12-17 2 views
0

Как вы можете совместить все символы до первого появления определенной последовательности символов с помощью grep? Я ищу способ выполнить эту задачу в среде Linux, и поскольку я мог бы пропустить какой-то важный момент в функции grep, идеи с решениями с awk ir sed также приветствуются.Сопоставьте все вхождения в строке с grep

Проблема также включает в себя согласование отдельно всех вхождений шаблона в одной строке.

Чтобы лучше понять ситуацию, скажем, у нас есть команда
echo "word word" | grep -o 'w.*rd'

Похоже, он не совпадет вплоть до последнего вхождения последовательности rd, поэтому, когда мы запустим это мы получаем:
word word

То, что я на самом деле ищу это:

word 
word 

ответ

4

Вам нужно сделать нежадное матч здесь, чтобы остановиться при первом появлении. Но поскольку grep не поддерживает нежадный матч по умолчанию, вы можете использовать отрицание класса символов:

echo "word word" | grep -o 'w[^r]*rd' 

Если вы имеете GNU Grep, то вы можете использовать -P параметр, чтобы включить синтаксис регулярных выражений Perl. И тогда это будет работать:

echo "word word" | grep -Po 'w.*?rd' 
+0

Благодарим за правильный ответ! –

3

Вы можете использовать -E опцию в grep для расширенного регулярного выражения и использовать .*? (нежадным матч):

echo "word word" | grep -Eo 'w.*?rd' 
word 
word 
0

«Grep» возвращает каждый строку, которая соответствовала против указанного вами шаблона.

Кажется, что вы ищете подходящий образец для слово, а не строку.

Как насчет разрыва ввода в строки отдельных слов? Нравится это, например:

echo "word word" | tr -s ' ' '\n' | grep word