
Ich versuche, sed zu verwenden, um nach einer Zeile anzuhängen , die sowohl als appendstring
auch enthält .Hello
World
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 -i
Schalter.
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