ubuntuusers.de

Bash: Text in eine Datei hinter bestimmter Zeile einfügen

Status: Ungelöst | Ubuntu-Version: Ubuntu 12.04 (Precise Pangolin)
Antworten |

Mojo_Dodo

Anmeldungsdatum:
31. Januar 2008

Beiträge: 212

Hallo,

in meinem Bash-Skript möchte ich den Befehl einbauen, dass nach einer bestimmten Zeile, welche einen genau definierten Text enthält eine neue Zeile mit Text eingefügt wird.

Ich habe folgendes gefunden:

sed '2i Blabla' pafad/zur/datei

aber das funktioniert nur, wenn ich genau weiß in welche Zeile der neue Text eingefügt werden soll. Wenn z.B. hinter jeder Zeile die z. B. "[TEXT]" heißt eine neue Zeile mit "Blabla" einfügen will, bringt mir dieser Befehl aber ja nichts.

Ich muss das Problem nicht unbedingt mit sed lösen, falls es andere Bordmittel gibt ist das natürlich genau so guṫ.

Vielen Dank schonmal!

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Wohnort: Wolfen (S-A)

Die "2" ist ja die Zeilenadresse, bei der der Befehl ausgeführt wird. Dort kannst Du statt der Zeilennummer auch ein Suchmuster verwenden:

sed '/stichwort/i Blabla'  pfad/zur/datei

Allerdings wird das bei allen Zeilen aktiv, bei denen der Reguläre Ausdruck "/stichwort/" passt.

Edit: Wenn sed nur beim 1. Mal aktiv werden soll, ist das ein bisschen Basteln. Einmal, weil der a- Befehl immer bis zum Zeilenumbruch arbeitet, und zum Anderen, weil Du danach in eine Schleife gehen musst, in der sed nur noch blind druckt:

sed '/stichwort/{ a Blabla
; :label n; b label }'  pfad/zur/datei

Außerdem meinst Du wahrscheinlich den a- Befehl, denn der i- Befehl fügt die Zeile vor der passenden Zeile ein.

LG,

track

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17626

Wohnort: Berlin

1
sed '/^muster$/i NEU'  FILE

sucht das komplette Muster, vom Zeilenanfang (Caret) bis zum Ende (Dollar).

Mojo_Dodo

(Themenstarter)

Anmeldungsdatum:
31. Januar 2008

Beiträge: 212

Vielen Dank euch für die Antworten! Ja, ich habe in der Tat den Befehl "a" gemeint.

sed '/^muster$/a NEU'  FILE

funktioniert also wunderbar.

Noch eine Frage habe ich dazu: Mit dem momentanen Befehl wird hinter jeder Zeile die den Text enthält eine neue eingefügt. Das reicht mir momentan für meine Zwecke, aber wie ginge das, dass nur hinter der Zeile eine neue eingefügt wird in der mein Text als erstes steht? Damit könnte derselbe Text weiter unten in der Datei vorkommen ohne, dass dahinter meine neue Zeile eingefügt wird.

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Wohnort: Wolfen (S-A)

Mojo Dodo schrieb:

Noch eine Frage habe ich dazu: ... wie ginge das, dass nur hinter der Zeile eine neue eingefügt wird in der mein Text als erstes steht? Damit könnte derselbe Text weiter unten in der Datei vorkommen ohne, dass dahinter meine neue Zeile eingefügt wird.

Genau das hatte ich Dir oben in dem Edit: doch schon beschrieben ?!
- Du hängst einfach eine Schleife an, die nur noch druckt, das ist bei sed das einfachste.

track

Vain

Avatar von Vain

Anmeldungsdatum:
12. April 2008

Beiträge: 2510

Weil mir gerade danach ist: Mit „ed“ wird das Einfügen nur beim ersten Auftreten etwas besser menschenlesbar.

1
2
3
4
5
6
ed dateiname <<EOF
/muster/a
Hier steht die neue Zeile.
.
wq
EOF

Er geht einfach in die erste Zeile, die den regulären Ausdruck „muster“ enthält, und führt dort den „a“-Befehl aus (der mit dem einzelnen Punkt beendet wird – es könnten ja mehrere Zeilen eingefügt werden). Danach speichern und beenden.

Antworten |