Löschen Sie Zeilen, die das Muster enthalten, und die Zeile vor [Duplikat].

Löschen Sie Zeilen, die das Muster enthalten, und die Zeile vor [Duplikat].

Ich möchte zwei Zeilen in einer Datei löschen, die das Muster enthalten aaa bbb ccc.

Ich habe den folgenden Ausdruck verwendet, der die Zeile mit dem Muster aaa bbb cccund die Zeile davor löscht.

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

Dies funktioniert für eine Datei. Es funktioniert nicht für mehrere Dateien

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

Beispieldatei:

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

Ergebnisdatei:

xxx
eee
ggg
hhh

Antwort1

Sieht aus, als ob Sie verwenden gnu sed- in diesem Fall können Sie etwas tun wie

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

Bei anderen seds müssten Sie eine Schleife über die Liste der Dateien ausführen

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

Dadurch werden immer zwei Zeilen im Musterbereich beibehalten und die erste gedruckt, wenn der Musterbereich nicht übereinstimmt. Bei einer Eingabe wie

some line
PATTERN
PATTERN
more
lines
another line
PATTERN

es wird gedruckt

more
lines

verwandte Informationen