sed append nach einer Zeile, die mehrere ungeordnete Zeichenfolgen enthält

sed append nach einer Zeile, die mehrere ungeordnete Zeichenfolgen enthält

Ich versuche, sed zu verwenden, um nach einer Zeile anzuhängen , die sowohl als appendstringauch enthält .HelloWorld

Hello something here World
World fsf Hello

Dies funktioniert, wenn ich die Reihenfolge beachte:

sed -i '/Hello*World\|World*Hello/a appendstring' file

Wenn ich aber viele Zeichenfolgen abgleichen muss und diese nicht in der richtigen Reihenfolge sind, ist dies definitiv nicht effektiv.

Dann habe ich Lösungen aus einem anderen Link ausprobiert, in denen es um das Löschen einer Zeile ging, die beide Zeichenfolgen enthält, ohne deren Reihenfolge zu berücksichtigen.

https://stackoverflow.com/questions/28561519/delete-lines-that-contain-two-strings

Jedoch,

sed -i '/Hello/!b;/World/d' file

Auch das Löschen funktioniert nicht.

Das Folgende ist auch eine der Antworten auf diese Frage:

sed -i '/Hello/{/World/d}' file

Werke,also habe ich versucht, es so zu implementieren, dass es angehängt wird. Dazu habe ich verwendet:

sed -i '/Hello/{/World/a} appendstring' file

Aber ich habe den Fehler erhalten:

sed: -e expression #1, char 0: unmatched `{'

Aktualisieren: Der Beitrag im Link gab die Lösung mit !b an, und sie funktionierte in cshell wegen des Ausrufezeichens nicht, aber in sh und bash funktioniert sie. Und sie kann auch leicht erweitert werden, um viele Zeilen einzufügen, wenn sed in einem Skript ausgeführt wird, und dann einen großen Absatz anzuhängen.

sed -i '/Hello/!b; /World/a \
addline \
addanotherline ' file

Antwort1

Da hättest du es fast geschafft mit:

sed -i '/Hello/{/World/a} appendstring' file

Sie müssen Ihre Argumente trennen. Verwenden Sie -e, etwa so:

sed -i -e '/Hello/{/World/a appendstring' -e '}' file

Beachten Sie, dass die Verwendung derADer ppend-Befehl ohne Newline ist eine GNU-Erweiterung, ebenso wie der -iSchalter.


Um dies portabler zu machen und dabei auch die Möglichkeit mehrerer abzugleichender Zeichenfolgen zu berücksichtigen, versuchen Sie Folgendes:

sed '/multiple/{/words/{/to/{/match/ s/$/append this/;};};}' file > newfile
mv newfile file

Da Sie bereits GNU Sed verwenden, verwenden Sie einfach:

sed -i -e '/multiple/{/words/{/to/{/match/ a append this' -e 'a and also this' -e 'a oh and this too' -e '};};}' file

verwandte Informationen