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