Я хотел бы удалить две строки в файле, содержащем шаблон 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
С другими sed
s вам пришлось бы перебирать список файлов
for file in ./*.txt
do
sed '$!N;/PATTERN/!P;D' "$file"
done
Это всегда будет сохранять две строки в пространстве шаблона и выводить первую, если пространство шаблона не совпадает, поэтому при вводе типа
some line
PATTERN
PATTERN
more
lines
another line
PATTERN
он будет печатать
more
lines