Подавить сам матч в grep - PullRequest
4 голосов
/ 02 марта 2011

Предположим, у меня много файлов в виде

First Line Name
Second Line Surname Adress
Third Line etc
etc

Теперь я использую grep для соответствия первой строке. Но я делаю это на самом деле, чтобы найти вторую строку. Вторая строка не является шаблоном, который можно сопоставить (это зависит только от первой строки). Мой шаблон регулярных выражений работает, и я использую команду

grep -rHIin pattern . -A 1 -m 1

Теперь опция -A выводит строку после совпадения . Параметр -m останавливается после 1 совпадения (потому что есть другая строка, которая соответствует моему шаблону, но в любом случае меня интересует только первое совпадение ...)

Это на самом деле работает, но вывод выглядит так:

./example_file:1:        First Line Name
./example_file-2-        Second Line Surname Adress

Я прочитал руководство, но не смог найти подсказки или информации об этом. Теперь вот вопрос.

Как я могу подавить сам матч ? Вывод должен быть в виде:

./example_file-2-        Second Line Surname Adress

Ответы [ 4 ]

2 голосов
/ 02 марта 2011

sed на помощь:

sed -n '2,${p;n;}'

Конкретная команда sed здесь начинается со строки 2 своего ввода и печатает каждую вторую строку. Перенаправьте вывод grep в него, и вы получите только четные строки из вывода grep.

Объяснение самой команды sed:

2,$ - диапазон строк от строки 2 до последней строки файла

{p;n;} - p наберите текущую строку, затем ig n или следующую строку (это затем повторяется)

(В этом особом случае всех четных строк альтернативный способ написания этого будет sed -n 'n;p;', так как нам на самом деле не нужно специально выделять какие-либо первые строки. Если вы хотите пропустить первые 5 строк файл, это было бы невозможно, вам нужно использовать синтаксис 6,$.)

1 голос
/ 02 марта 2011

Вы можете использовать sed для печати строки после каждого совпадения:

sed -n '/<pattern>/{n;p}' <file>

Чтобы получить рекурсию и имена файлов, вам потребуется что-то вроде:

find . -type f -exec sed -n '/<pattern>/{n;s/^/{}:/;p}' \;
0 голосов
/ 02 марта 2011

Если вы уже читали книгу по grep, вы также можете прочитать руководство по awk , другому распространенному инструменту Unix.

В awk ваша задача будет решена с помощью хорошегопростой код(Что касается меня, мне всегда приходится обновлять свои знания о синтаксисе awk, переходя к руководству (info awk), когда я хочу его использовать.)

Или вы можете предложить решение, сочетающее find (для перебора ваших файлов) и grep (для выбора строк) и head / tail (для отбрасывания для каждого отдельного файла ненужных строк).Сложность, связанная с find, заключается в возможности работать с каждым файлом по отдельности, отбрасывая строку на файл.

0 голосов
/ 02 марта 2011

Вы можете передать результаты, хотя grep -v pattern

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...