Exclua as linhas que contêm o padrão e a linha antes de

Exclua as linhas que contêm o padrão e a linha antes de

Gostaria de excluir duas linhas em um arquivo contendo pattern aaa bbb ccc.

Usei a seguinte expressão, que exclui a linha que contém o padrão aaa bbb ccce a linha anterior.

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

Isso funciona para um arquivo. Não funciona para vários arquivos

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

arquivo de exemplo:

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

arquivo de resultado:

xxx
eee
ggg
hhh

Responder1

Parece que você está usando gnu sed- nesse caso você pode fazer algo como

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

Com outros sedprogramas você teria que percorrer a lista de arquivos

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

Isso sempre manterá duas linhas no espaço do padrão e imprimirá a primeira se o espaço do padrão não corresponder a uma entrada como

some line
PATTERN
PATTERN
more
lines
another line
PATTERN

ele irá imprimir

more
lines

informação relacionada