Удалить строки, содержащие шаблон, и строку перед

Удалить строки, содержащие шаблон, и строку перед

Я хотел бы удалить две строки в файле, содержащем шаблон aaa bbb ccc.

Я использовал следующее выражение, которое удаляет строку, содержащую шаблон aaa bbb ccc, и строку перед ним.

$ sed -n '/aaa bbb ccc/{s/.*//;x;d;};x;p;${x;p;}' file.txt | sed '/^$/d'

Это работает для одного файла. Это не работает для нескольких файлов.

$ for i in *.txt; do sed -n '/aaa bbb ccc/{s/.*//;x;d;};x;p;${x;p;}' "$i" | sed '/^$/d'; done

пример файла:

xxx
yyy
aaa bbb ccc
eee
fff
aaa bbb ccc
ggg
hhh

файл результата:

xxx
eee
ggg
hhh

решение1

Похоже, вы используете gnu sed- в таком случае вы можете сделать что-то вроде

sed -s 'N;/PATTERN/!P;D' ./*.txt

С другими seds вам пришлось бы перебирать список файлов

for file in ./*.txt
do
sed '$!N;/PATTERN/!P;D' "$file"
done

Это всегда будет сохранять две строки в пространстве шаблона и выводить первую, если пространство шаблона не совпадает, поэтому при вводе типа

some line
PATTERN
PATTERN
more
lines
another line
PATTERN

он будет печатать

more
lines

Связанный контент