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 ccc
und 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 sed
s 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