Fügen Sie unter jeder Zeile, die einem Muster entspricht, nur dann eine Zeile hinzu, wenn diese noch nicht vorhanden ist.

Fügen Sie unter jeder Zeile, die einem Muster entspricht, nur dann eine Zeile hinzu, wenn diese noch nicht vorhanden ist.

Kann sedunter 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 perlAusdruck 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 Zeilen apache 4.2.
  • s+Os version rhel5.6+Os version rhel5.6\napache 4.2+; printsucht Os version rhel5.6und ersetzt die Zeile durch dieselbe, indem apache 4.2an 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.2bedingungslos 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

verwandte Informationen