Kann sed
unter einem bestimmten Inhalt eine neue Zeile hinzugefügt werden. Wenn der Eingabeinhalt vorhanden ist, soll er dann belassen werden?
Aktueller Inhalt der Dateissss
Hostname example.com
Os version rhel5.6
apache 4.2
Hostname example2.com
Os version rhel5.6
Gewünschter Inhalt der Dateissss
Hostname example.com
Os version rhel5.6
apache 4.2
Hostname example2.com
Os version rhel5.6
apache 4.2
Ich kann den Inhalt mit dem folgenden Befehl hinzufügen
sed -i '/Os version rhel5.6/a apache 4.2' ssss
Meine Frage
Ich möchte unter einem angegebenen Inhalt eine Zeile hinzufügen. Wenn der Inhalt in der Datei vorhanden ist, lassen Sie ihn stehen. Wenn der Inhalt nicht vorhanden ist, fügen Sie ihn hinzu.
Antwort1
Dieser perl
Ausdruck wird es richten,
perl -i -ne 'next if /apache 4.2/;s+Os version rhel5.6+Os version rhel5.6\napache 4.2+; print' ssss
Erläuterung
next if /apache 4.2/
überspringt alle übereinstimmenden Zeilenapache 4.2
.s+Os version rhel5.6+Os version rhel5.6\napache 4.2+; print
suchtOs version rhel5.6
und ersetzt die Zeile durch dieselbe, indemapache 4.2
an eine neue Zeile angehängt wird.
Testen Sie mit Ihrer Eingabedatei
$ cat ssss
Hostname example.com
Os version rhel5.6
apache 4.2
Hostname example2.com
Os version rhel5.6
$ perl -ne 'next if /apache 4.2/;s+Os version rhel5.6+Os version rhel5.6\napache 4.2+; print' ssss
Hostname example.com
Os version rhel5.6
apache 4.2
Hostname example2.com
Os version rhel5.6
apache 4.2
Antwort2
So kann dies beispielsweise erfolgen sed
:
sed '/Os version rhel5\.6/{
a\
apache 4.2
$!{
n
/^apache 4\.2$/d
}
}' infile
Dies wird apache 4.2
bedingungslos an alle übereinstimmenden Zeilen angehängt Os version rhel5.6
, dann (wenn nicht in der letzten Zeile) wird die nächste Zeile über eingefügt n
(Drucken des Musterbereichs) und wenn der neue Inhalt des Musterbereichs übereinstimmt, apache 4.2
wird er gelöscht. Passen Sie den regulären Ausdruck bei Bedarf an, um führende/nachgestellte Leerzeichen einzuschließen, z. B./^[[:blank:]]*apache 4\.2[[:blank:]]*$/d