Wie finde ich eine Zeichenfolge in einer Datei und platziere eine Zeichenfolge darüber?

Ich möchte den String __MARKER__in finden someFile.txtund einen String darüber platzieren (z. B. Hello World!).

Wie würde ich das mit machen sed?

sed -i -e 's/__MARKER__/Hello world\n__MARKER__/' someFile.txt

Nach dem Ausführen des obigen Snippets ist der Inhalt von jedoch someFile.txtunten:

Hello worldn__MARKER__

Inhalt someFile.txtvor Manipulation:

__MARKER__

Inhalt someFile.txtnach Manipulation:

Hello World!
__MARKER__
Auch hier gefragt: askubuntu.com/q/1044271/10127 – haben die Antworten dort nicht für Sie funktioniert?

Antworten (2)

s/…/…/ist eine Substitution, die den ersten durch den zweiten ersetzt . Sie können eine neue Zeile in Ihrer Zeichenfolge verwenden, um Text über oder unter einem Zeilenumbruch einzufügen.

sed -i -e 's/__MARKER__/Hello world\
__MARKER__/' someFile.txt

Maskieren Sie die neue Zeile mit einem Backslash, sonst erhalten Sie "nicht maskierter Zeilenumbruch innerhalb des Ersatzmusters". Um eine neue Zeile im Terminal einzugeben, verwenden Sie ⌥↩︎.

Sie können &die Übereinstimmung als Kurzschrift verwenden, sodass Sie sie bei der Ersetzung nicht erneut eingeben müssen.

sed -i -e 's/__MARKER__/Hello world\
&/' someFile.txt
Was ist, wenn drin someFile.txtist // __MARKER__? Beachten Sie die //. Muss ich ihm entkommen?
@Nicholas Dann wird dir danach in der Leitung // Hello worldgefolgt __MARKER__. Ich bin mir nicht sicher, worauf Sie sich mit Escaping beziehen //, die Substitution sucht lediglich nach der Markierungszeichenfolge und ersetzt sie durch die Substitution.

Eine weitere Option ist die Einfügefunktionsed von .

Eingang:

cat someFile.txt

Ausgang:

apple
orange
grape
pineapple
plum
_MARKER_
banana


Eingang:

sed '/_MARKER_/i\
Hello World!
' someFile.txt

Ausgang:

apple
orange
grape
pineapple
plum
Hello World!
_MARKER_
banana