GNU/Linux >> LINUX-Kenntnisse >  >> Linux

sed:Wie wird eine Zeile ersetzt, wenn sie gefunden wird, oder an das Ende der Datei angehängt, wenn sie nicht gefunden wird?

Mit sed ist es eigentlich ganz einfach :Wenn eine Zeile passt, kopiere sie einfach in die h altes Leerzeichen dann s Wert ersetzen.
Auf der la$ t Zeile ex Ändern Sie den Haltebereich und den Musterbereich und prüfen Sie, ob letzterer leer ist. Wenn es nicht leer ist, bedeutet dies, dass die Ersetzung bereits vorgenommen wurde, also nichts zu tun ist. Wenn es leer ist, bedeutet das, dass keine Übereinstimmung gefunden wurde, also ersetzen Sie den Musterbereich durch den gewünschten variable=value dann an die aktuelle Zeile im Haltepuffer anhängen. Schließlich ex wieder ändern:

sed '/^FOOBAR=/{h;s/=.*/=newvalue/};${x;/^$/{s//FOOBAR=newvalue/;H};x}' infile

Oben ist gnu sed Syntax. Tragbar:

sed '/^FOOBAR=/{
h
s/=.*/=newvalue/
}
${
x
/^$/{
s//FOOBAR=newvalue/
H
}
x
}' infile

Das lässt sich wohl kürzen. Es ist kein einzelner sed-Befehl und verwendet auch grep, aber das scheint im Grunde das zu sein, was Sie wollen. Es ist eine einzelne Zeile und bearbeitet die Datei direkt (keine temporären Dateien).

grep -q "^FOOBAR=" file && sed "s/^FOOBAR=.*/FOOBAR=newvalue/" -i file || 
    sed "$ a\FOOBAR=newvalue" -i file

Hier ist ein einfacherer sed Ansatz, da ich sed nicht finde hold space leicht damit zu arbeiten. Wenn Sie mit hold space vertraut sind , bietet die Verwendung des don_crissti-Ansatzes eine zusätzliche Möglichkeit, alles aus der vorhandenen Zeile beizubehalten, aber dies ist normalerweise sehr selten.

Bei diesem Ansatz drucken Sie einfach alles bis auf die Zeile, die Sie löschen möchten, und fügen dann am Ende die Ersetzung an.

sed -n -e '/^FOOBAR=/!p' -e '$aFOOBAR=newvalue' infile

Linux
  1. So fügen Sie unter Linux einfach Text an das Dateiende an

  2. Wie fügt man Text vor der ersten Zeile einer Datei ein?

  3. Wie fügt man mehrere Zeilen an eine Datei an?

  4. Datei:Befehl nicht gefunden

  5. Wie füge ich mit sed Text in die erste Zeile einer Datei ein?

So lesen Sie eine Datei Zeile für Zeile in Bash

So entfernen Sie Zeilen aus einer Datei mit dem Sed-Befehl

Unix Sed Tutorial:Dateizeilen anhängen, einfügen, ersetzen und zählen

So verwenden Sie Sed zum Suchen und Ersetzen einer Zeichenfolge in einer Datei

Wie ersetze ich eine Datei im JAR durch die Befehlszeile in Linux?

Wie fügt man eine Zeile in eine gezippte Datei ein, ohne sie zu entpacken?