Wie füge ich Text nach einem bestimmten String in eine Datei ein?

69

Im Moment benutze ich, echo "Hello World" >> file.txtum Text an eine Datei anzuhängen, aber ich muss auch Text unterhalb einer bestimmten Zeichenfolge hinzufügen. Sagen wir "[Option]". Ist das mit möglich sed?

Z.B:

Eingabedatei

Some text
Random
[option]
Some stuff

Ausgabedatei

Some text
Random
[option]
*inserted text*
Some stuff
Javier Villanueva
quelle
1
Sie müssen genauer sein und Beispieltexte bereitstellen, damit die Benutzer Ihnen mit genauen Befehlen helfen können.
Clement
Bitte bearbeite dein Q und zeige die inputund die outputZeilen. Weil Sie Q ist unklar. Sie könnten es auch tun echo "Hello World [option]" >> file.txt, aber es ergibt keinen Sinn.
Ich habe die Frage bearbeitet, um weitere Informationen als Referenz bereitzustellen, aber die akzeptierte Antwort war das, was ich erreichen wollte
Javier Villanueva
Wenn Sie nur eine Konfigurationsdatei bearbeiten möchten, ist dies die beste Lösung, die ich gefunden habe: unix.stackexchange.com/a/78076/20661
rubo77

Antworten:

104

Zeile nach Übereinstimmung anhängen

  • sed '/\[option\]/a Hello World' input

Zeile vor dem Spiel einfügen

  • sed '/\[option\]/i Hello World' input

Zusätzlich können Sie ein Backup erstellen und die Eingabedatei direkt bearbeiten, indem Sie die -i.bkpOption sed verwenden

Rahul Patil
quelle
2
auf osx bekomme ichsed: 1: "/pattern/a some text here": command a expects \ followed by text
the_prole
Für Mac OSX musste ich \ <<NEWLINE>>nach der aOption hinzufügen
Tom Howard
Mit dem obigen Code wird die Zeile für jede einzelne Übereinstimmung angehängt / eingefügt. Wenn Sie die Zeile nur für die erste Übereinstimmung anhängen / einfügen möchten, können Sie 0,den Befehlen voranstellen : sed '0,/\[option\]/a Hello World' inputodersed '0,/\[option\]/i Hello World' input
kimbaudi
33

Ja, das ist möglich mit sed:

sed '/pattern/a some text here' filename

Ein Beispiel:

$ cat test
foo
bar
option
baz
$ sed '/option/a insert text here' test
foo
bar
option
insert text here
baz
$
devnull
quelle
2
@javiervd Ich bin nicht sicher, was du mit erster Antwort gemeint hast? Wenn du zuerst mit der Zeit geantwortet hast, dann liegst du falsch. Sie haben die Zeitstempel nicht genau beachtet!
Devnull
Gibt es eine Möglichkeit, es hinzuzufügen, nachdem die letzte Zeichenfolge gefunden wurde? Zum Beispiel: foo bar option bar option baz . So wird das Muster foo bar option bar option addedstring baz ?
Ari
4

Mit awk:

awk '1;/PATTERN/{ print "add one line"; print "\\and one more"}' infile

Denken Sie daran, dass einige Zeichen nicht wörtlich eingeschlossen werden können, sodass Sie Escape-Sequenzen verwenden müssen (sie beginnen mit einem Backslash), um beispielsweise einen wörtlichen Backslash zu drucken, den Sie schreiben müssen \\.

Es ist eigentlich das gleiche mit, sedaber zusätzlich muss jeder eingebetteten Zeile im Text ein Backslash vorangestellt werden:

sed '/PATTERN/a\
add one line\
\\and one more' infile

Weitere Informationen zu Escape-Sequenzen finden Sie im Handbuch.

don_crissti
quelle
Eine awk-Zeile ändert nicht den Text, sondern nur die Ausgabe.
Josef Klimuk