Ich möchte jede Zeile löschen, die ein Muster nach der ersten Zeile enthält (das Muster ist /^country\t/
). Ich kann löschen jeden Vorkommen mit sed '/^country\t/d' in.txt > out.txt
, aber ich möchte das erste Vorkommen in der ersten Zeile behalten.
Die Hintergrundgeschichte ist, dass ich ein Verzeichnis tabulatorgetrennter Dateien mit Headern habe und diese Dateien mit verkette cat
. Ich möchte die zusätzlichen Header entfernen.
In Vim könnte ich sowas machen : 2,$g/^country\t/d
, aber ich kann die sed-Lösung nicht herausfinden. Wenn ich es versuche sed '2,$ /^country\t/d in.txt > out.txt
Ich bekomme den Fehler unknown command: /
.
Vielen Dank!
s///g
konstruiere und mache das muster so ähnlich wie/^country.*\n/
?Dadurch wird jede übereinstimmende Zeile NACH der ersten übereinstimmenden Zeile gelöscht. Kommentar:
quelle
Wenn das / pattern / nicht mit einer leeren Zeile übereinstimmt, verwenden Sie "the
hold
Leerzeichen wird als Leerzeile initialisiert ", um die erste Übereinstimmung zu testen:Behalte die erste Zeile bei:
sed '/pattern/ {x; /^$/!d; g;}' file
Lass die erste Zeile fallen:
sed '/pattern/ x' file
bearbeite nur die erste Zeile:
sed '/pattern/ {x; /^$/!b'$'\n'' g; s/pattern/xx/; }' file
Bearbeiten Sie nur die folgende Zeile:
sed '/pattern/ {x; s/pattern/xx/; t'$'\n'' g; }' file
PS:
$'\n'
(kein;
) folgtt
oderb
und bsd sed glücklich machen.quelle