Я знаю, что с помощью "-A NUM"
переключателя я могу печатать определенное количество строк после каждого совпадения. Мне просто интересно, можно ли печатать конечные строки, пока после каждого совпадения не будет найдено определенное слово. Например, когда я ищу «Слово А», я хочу видеть строку, содержащую «Слово А», а также строки после него, пока не появится строка, содержащая «Слово D».
контекст:
Word A
Word B
Word C
Word D
Word E
Word F
команда:
grep -A10 'Word A'
Мне нужен этот вывод:
Word A
Word B
Word C
Word D
| sed -e '1d;$d'
, то есть удалите первую и последнюю строкуsed -n -e '/pattern A/,/pattern D/d; p'
Это говорит: «удалите из шаблона A в шаблон D и напечатайте все остальное». К сожалению, этот матч жадный. Это означает, что если шаблоны A и D появляются более одного раза, вы будете сравнивать от первого шаблона A до последнего шаблона D. Я боюсь, что Perl или Python - ваши друзья, если это так.почему бы не использовать awk?
источник
Word D
находится на той же строкеWord A
, что и, возможно, где-то еще, например,Word A Word D\nWord D
с помощью sed будет показано две строки, где awk покажет одну. Кроме того, можно по-прежнему использовать переменные с awk, напримерawk -v _word="Word A" '$0 ~ _word,/Word D/' "/some/file"
, так что sed может быть более эффективным, но при работе с поиском двух строк, которые могут или не могут находиться на одной строке, awk определенно будет более надежным.A
и ,B
и вы только хотите , чтобы захватить то , что между каждой такой последовательностью. похоже, что в моем случае sed не следует этой семантике, по крайней мере.или
источник
sed
это, если вам не нужна мощь регулярных выражений Perl для выбора разделительных строк.