Ist es bei einer einzelnen Eingabedatei, die nur Kommentare (beginnend mit #) und VARIABLE = Wertzeilen enthält, möglich, einen Wert für eine einzelne Variable zu ersetzen, wenn sie gefunden wird, und das Paar andernfalls an das Dateiende anzuhängen, wenn sie nicht gefunden wird?
Meine aktuelle Methode löscht sie in einem ersten Durchgang und hängt sie dann in einem zweiten Durchgang an das Ende der Datei an. Diese Methode bringt jedoch die Zeilenreihenfolge durcheinander (und besteht auch aus zwei verschiedenen Befehlen):
sed -r "/^FOOBAR=.*$/d" -i samefile &&
sed -r "$ a\FOOBAR=newvalue" -i samefile
Gibt es sowieso dafür, dh. Zeilenreihenfolge in einer einzigen Sed-Zeile einhalten? Wenn ein anderes Dienstprogramm (awk, ...) dies tut, übernehme ich sed.
quelle
newvalue
es in einer Variablen gespeichert ist?sed "/^${varName}=/{h;s/=.*/=${varValue}/};\${x;/^$/{s//${varName}=${varValue}/;H};x}" ${VARFILE}
mit Variablen, doppelten Anführungszeichen, um das Ersetzen von Variablen zu ermöglichen, und einem$
$$varName
sed "/^${varName}=/{h;s/=.*/=${!varName}/};\${x;/^$/{s//${varName}=${!varName}/;H};x}" ${VARFILE}
Dies kann wahrscheinlich verkürzt werden. Es ist kein einziger sed-Befehl und es verwendet auch grep, aber dies scheint im Grunde das zu sein, was Sie wollen. Es ist eine einzelne Zeile und bearbeitet die Datei direkt (keine temporären Dateien).
quelle
Hier ist ein einfacherer
sed
Ansatz, da ich es nichtsed
hold space
einfach finde, damit zu arbeiten. Wenn Siehold space
mit dem don_crissti-Ansatz vertraut sind , haben Sie zusätzlich die Möglichkeit, die vorhandene Linie zu erhalten. Dies ist jedoch normalerweise sehr selten.Bei diesem Ansatz drucken Sie nur alle Zeilen außer der Zeile, die Sie löschen möchten, und hängen dann am Ende die Ersetzung an.
quelle
Basierend auf den anderen Antworten ersetzen Sie den Wert einer Variablen, wenn diese Variable in der Datei vorhanden ist, und hängen ihn an das Ende der Datei an, wenn dies nicht der Fall ist (was nicht der Fall ist, den Ihre veröffentlichten
sed
Befehle tun) könnte dies versuchen:quelle
In awk ist es ein bisschen einfacher, obwohl das "In-Place-Editieren" nicht automatisch erfolgt:
quelle
Verwenden Sie einfach
grep
undecho
, um einen leeren Datensatz zu erstellen:Jede Zeile wird mit dem Fehlercode Null ausgeblendet.
quelle
grep
echo
Funktioniert eigentlich mit:
sed -i '/^FOOBAR=/{h;s/=.*/=newvalue/};${x;/^$/{s//FOOBAR=newvalue/;H};x}' infile
In der gewählten Antwort fehlt -i.quelle
Dies mit Perl und In-Place zu tun, funktioniert gut für mich:
quelle
grep
undecho
undperl
anstatt alles zu tunperl
? Schreiben Sie auch in eine Datei (>> my.file
), während Sie daraus lesen (grep my.file
)?