Пропустить строки файла, пока не будет найдено совпадение, а затем вывести остальные - PullRequest
11 голосов
/ 13 октября 2008

Я могу написать тривиальный скрипт для этого, но в моем продолжающемся стремлении получить больше знакомства с Unix я хотел бы изучить эффективные методы, используя вместо этого встроенные команды.

Мне нужно иметь дело с очень большими файлами, которые имеют переменное количество строк заголовка. последняя строка заголовка состоит из текста «LastHeaderLine». Я хочу вывести все после этой строки. (Я не беспокоюсь о ложноположительных совпадениях.)

Ответы [ 3 ]

24 голосов
/ 13 октября 2008

Аналогично ответу Avi , но без включения строки с «LastHeaderLine».

sed -e '1,/LastHeaderLine/d'
10 голосов
/ 13 октября 2008

Почему бы не попробовать awk для этого? Это будет выглядеть так:

awk 'NR == 1, /LastHeaderLine/ { next } { print }' myinputfile > myoutputfile

где NR == 1 верно для первой строки, / LastHeaderLine / соответствует вашей последней строке заголовка. Оператор запятой позволяет следующей функции {next} запускать все предложения в диапазоне двух регулярных выражений. В этом случае он перейдет к следующей строке ввода без дальнейшей операции. Для всех остальных строк ввода он напечатает строки на стандартный вывод, который можно перенаправить с помощью>.

7 голосов
/ 13 октября 2008

Использование sed:

sed -ne '/LastHeaderLine/,$p' <inputfile

будет соответствовать всему от соответствия регулярному выражению до конца файла. 'p' печатает строки, которые совпадают.

Edit:

Если подумать, вы не хотите печатать строку, соответствующую LastHeaderLine. Это сложно сделать с помощью sed. В Perl вы можете сделать следующее:

perl -ne 'if ($flag) {print;} if (/LastHeaderFile/) {$flag=1;}' <inputfile

Это будет печатать только строки, строго следуя регулярному выражению.

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