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

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


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
$

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.


Eine awk-Zeile ändert nicht den Text, sondern nur die Ausgabe.
Josef Klimuk
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.