Как пометить соответствующую строку GREP при перенаправлении вывода в файл

3

Я пытаюсь использовать grep, чтобы найти все соответствующие строки в файле и вывести их в контексте строки в другой файл, добавив какие-то метки (в идеале две звездочки) с каждой стороны матча.

Например, у меня есть файл input.txt со следующим конкурсом:

Dog walks in the park
Man runs in the park
Man walks in the park
Dog runs in the park
Dog is still
They run in the park
Woman runs in the park

Затем я выполняю поиск grep с перенаправлением в файл:

grep -P ' runs? ' input.txt > output.txt

Он создает файл output.txt со следующим конкурсом:

Man runs in the park
Dog runs in the park
They run in the park
Woman runs in the park

Вместо этого я хотел бы получить этот вывод:

Man **runs** in the park
Dog **runs** in the park
They **run** in the park
Woman **runs** in the park

То есть для каждого совпадения в контексте добавить две звездочки вокруг этого соответствия.

Я знаю, что могу получить только совпадения, добавив опцию -o :

grep -P ' runs? ' input.txt > output.txt

, но мне нужно увидеть их в контексте.

Я также знаю, что я могу выделить эти соответствия в интерактивном сеансе, выполнив это:

GREP_OPTIONS='--color=auto'

, но я использую grep внутри скрипта bash, поэтому мне это бесполезно.

Так что мне интересно, есть ли способ отметить эти соответствия в выходном файле, непосредственно с grep. Я знаю, что, возможно, позже я смогу передать grep-вывод в другую команду для достижения этой цели, но я бы предпочел использовать какой-то параметр grep. Является ли это возможным? Если нет, то самый простой способ достичь желаемого результата при объединении grep с другими инструментами?

    
задан Rafal 21.07.2015 в 14:20
источник

1 ответ

5

Вы хотите использовать другие инструменты для выполнения замещений, например sed :

sed -n 's/ \(runs\?\) / **** /p' input.txt > output.txt

Или Perl:

perl -ne 's/ (runs?) / **** /&&print' input.txt > output.txt
    
ответ дан kos 21.07.2015 в 14:31
источник