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

3

Gostaria de excluir duas linhas em um arquivo contendo o padrão aaa bbb ccc .

Eu usei a seguinte expressão, que exclui a linha que contém padrão aaa bbb ccc e 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
    
por xralf 23.05.2017 / 10:08

1 resposta

7

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

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

Com outros sed s 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 padrão e imprimirá a primeira se o espaço padrão não corresponder a uma entrada como

some line
PATTERN
PATTERN
more
lines
another line
PATTERN

imprimirá

more
lines
    
por 23.05.2017 / 11:49

Tags