Как отфильтровать 2 строки для каждой строки, соответствующей регулярному выражению grep?
это мой минимальный тест:
SomeTestAAAA
EndTest
SomeTestABCD
EndTest
SomeTestDEFG
EndTest
SomeTestAABC
EndTest
SomeTestACDF
EndTest
И, очевидно, я пытался, например, grep -vA 1 SomeTestAA
который не работает.
желаемый результат:
SomeTestABCD
EndTest
SomeTestDEFG
EndTest
SomeTestACDF
EndTest
text-processing
grep
Behrooz
источник
источник
Ответы:
Вы можете использовать
grep
с-P
(PCRE):(?!AA)
является отрицательным прогнозом нулевой ширины, гарантирующим, чтоAA
после не будетSomeTest
.Тестовое задание :
источник
\.
такgrep -P -A 1 'SomeTest\.(?!AA)' file.txt
илиgrep -P -A 1 'SomeTest(?!\.AA)' file.txt
SomeTest*\nEndTest
поэтому вы фактическиgrep
пропингуете все совпадающие строки,SomeTest*
но неSomeTestAA
+ одну строку контекста после совпадения. Добавьте еще несколько строк для ввода (например, добавьте строкуfoobar
после каждойEndTest
строки), затем попробуйте снова.Вот
sed
решение (-n
то есть без автопечати), которое работает с произвольным вводом:так с входом, как
Бег
выходы
то есть, он удаляет ровно те строки, которые
grep -A1 SomeTestAA infile
будут выделены:источник
//
совпадает/SomeTestAA/
. Я думал, в этом случае, он бы соответствовал отрицанию выражения:/SomeTestAA/!
. (+1)!
не является частью RE , этоsed
вещь.Возможно, вам повезет больше с чем-то, что рассматривает многострочные регионы как отдельные записи. Есть то,
sgrep
что я не использовал много.Также есть awk, где вы можете установить разделитель входной записи и разделитель выходной записи на все, что захотите.
Большая часть программы awk заключена в одинарные кавычки, но в конце я изменяю на двойные кавычки, чтобы
$pat
можно было расширить переменную оболочки.источник
awk -vpat="^SomeTestAA" -vRS="\nEndTest\n" 'BEGIN{ ORS=RS } $0 !~ pat' file
Одним из вариантов является использование
p
erl-c
совместимогоr
egulare
xpressiongrep
:Опция
-M
позволяет шаблону соответствовать более чем одной строке.источник
grep
уже поддерживает PCRE (через-P
опцию), в чем преимущество использованияpcregrep
?grep
не поддерживает-M
параметр.Используя стандарт
sed
:sed
Скрипт анализирует файл строку ввода по линии, и когда линия соответствует шаблонуSomeTestAA
, двеsed
команд редактированияN
иd
выполняется. КомандаN
добавляет следующую строку ввода в пространство шаблона (буфер, которыйsed
можно редактировать),d
удаляет пространство шаблона и запускает следующий цикл.источник
Пробовал с командой Below sed, и она работала нормально
команда
выход
источник
Вы можете использовать GNU
sed
«sd
команды для удаления строки, и префикс его с/pat/,+N
выбором строки , соответствующей шаблон и последующие N строк. В вашем случае N = 1, поскольку вы хотите удалить только одну последующую строку после совпадающей строки:источник