Wie man eine Zeile in sed hinzufügt, wenn keine Übereinstimmung gefunden wird
Ich bin mit dem folgenden sed
- Befehl zu ersetzen, die einige Parameter in einer config-Datei:
sed -i 's/^option.*/option=value/g' /etc/fdm_monitor.conf
Nun habe ich ein problem. Wenn die Zeile nicht vorhanden ist, möchte ich hinzufügen, dass es an der Unterseite der Datei.
Rufe ich diese mit einem popen
aus einem C-Programm. Ich habe versucht, mit awk
.
InformationsquelleAutor der Frage Evilmachine | 2013-11-28
Du musst angemeldet sein, um einen Kommentar abzugeben.
Versuchen Sie dies:
InformationsquelleAutor der Antwort kev
Mithilfe der sed, die einfache syntax:
Dies würde ersetzen Sie den parameter, wenn es vorhanden ist, sonst würde es hinzufügen, um das Ende der Datei.
Verwenden Sie die
-i
option, wenn Sie die Datei Bearbeiten möchten.Wenn Sie möchten, zu akzeptieren und zu halten weiße Räume, und zusätzlich zu entfernen Sie das Kommentarzeichen, wenn die Zeile bereits vorhanden, aber auskommentiert, schreiben:
Bitte beachten Sie, dass weder die option noch Wert enthalten muss ein Schrägstrich
/
oder Sie müssen, um es zu entkommen, um\/
.Verwenden die bash-Variablen
$option
und$value
könnten Sie schreiben:Der bash Ausdruck
${option//\//\//}
Anführungszeichen, Schrägstriche, es ersetzt alle/
mit\/
.Alles kombiniert in einer bash-Funktion:
InformationsquelleAutor der Antwort Marc Wäckerlin
Mit
sed
könnte man sagen:Dies würde ersetzen Sie den parameter, wenn es vorhanden ist, sonst würde es hinzufügen, um das Ende der Datei.
Verwenden Sie die
-i
option, wenn Sie die Datei Bearbeiten möchten, in-place:InformationsquelleAutor der Antwort devnull
Als ein awk-nur one-liner:
ARGV[1] ist die Eingabe
file
. Es ist geöffnet und geschrieben in derfor
Schleife desEND
block. Eröffnungfile
für die Ausgabe in derEND
block ersetzt die Notwendigkeit für Tools wiesponge
oder schreiben auf eine temporäre Datei und dannmv
ing die temporäre Datei zufile
.Den beiden Zuordnungen der array -
a[]
sammeln alle Zeilen der Ausgabe ina
.if(!f)a[++n]=s
fügt die neuenoption=value
wenn die Haupt-awk-Schleife nicht finden konnteoption
imfile
.Habe ich Hinzugefügt einige Bereiche (nicht viele) für die Lesbarkeit, aber Sie brauchen wirklich nur einen Raum in der ganzen awk-Programm, das Leerzeichen nach
print
.Wenn
file
umfasst# comments
Sie werden bewahrt.InformationsquelleAutor der Antwort stepse
Hier ist ein one-liner sed, die nicht den job inline. Beachten Sie, dass es bewahrt die Position der variable und Ihren Einzug in der Datei, wenn Sie existiert. Dies ist oft wichtig für den Kontext, wie wenn es um Kommentare oder um, wenn die variable in einen eingerückten block. Jede Lösung basiert auf den "löschen-dann-append" Paradigmas schlecht an.
Mit einem generischen paar von variable/Wert-Sie können schreiben Sie es auf diese Weise:
Schließlich, wenn Sie wollen auch zu halten, inline-Kommentare, die Sie tun können, es mit einem catch-Gruppe. E. g. wenn
test.conf
enthält die folgenden:Dann läuft das
Produziert:
InformationsquelleAutor der Antwort MoonCactus
hier ist ein awk-Einzeiler:
diese nicht in-place ändern auf die Datei, Sie können jedoch :
InformationsquelleAutor der Antwort Kent
Hier ist ein
awk
UmsetzungFühren Sie es mit
oder
BEARBEITEN:
Als one-liner:
InformationsquelleAutor der Antwort rzymek
InformationsquelleAutor der Antwort Jack
Laden der Datei in den Puffer, der am Ende, ändern Sie alle vorkommen und wenn keine änderung auftreten, fügen Sie am Ende
InformationsquelleAutor der Antwort NeronLeVelu
Ich erarbeitet, der kev ist grep/sed-Lösung durch setzen von Variablen, um Doppelarbeit zu vermeiden.
Setzen Sie die Variablen in der ersten Zeile (Tipp:
$_option
zutreffen soll alles auf der Linie, bis der Wert [einschließlich Trennzeichen wie ( = ) oder :]).Daran, dass die
sh -c '...'
nur hat die Wirkung der Ausweitung des Anwendungsbereichs der Variablen, ohne die Notwendigkeit für eineexport
. (Siehe Das setzen einer environment-variable, bevor Sie einen Befehl in der bash funktioniert nicht für den zweiten Befehl in einer pipe)InformationsquelleAutor der Antwort flightwusel
Mit dieser Funktion können Sie zu finden und Suche nach config-änderungen:
InformationsquelleAutor der Antwort Guray Celik