2017-05-09 2 views
2

endet. Angenommen, eine mehrzeilige Textdatei (file) und das Schlüsselwort bar.Zeile vor Zeile voranstellen, wenn Zeile in Schlüsselwort

> cat file 
foo bar baz 
foo bar quux 
foo quux bar 

jeder Zeile, die mit der Zeichenkette vorangestellt werden Hello mit dem Schlüsselwort endet soll; Jede Zeile, die nicht gedruckt wird, wird so gedruckt, wie sie ist.

> cat file | sought_command 
foo bar baz 
foo bar quux 
Hello foo quux bar 

Ich glaube, das kann über awk (etwas entlang der Linien von awk '$ ~ /bar/ {print "Hello", $0}') durchgeführt werden, aber ich kann nicht mit dem richtigen Code kommen und würde Vorschläge zu schätzen wissen.

+0

die Worte Tab getrennt oder Leerzeichen getrennt sind? – Inian

+0

@Inian Die Wörter sind durch Leerzeichen getrennt. –

Antwort

2

Sie sind fast auf dem richtigen Weg Awk verwenden, nur die Regex Anker verwenden $ am Ende der Zeile zu markieren und die Zeichenfolge anhängen nach Bedarf

awk '$NF == "bar"{$0="Hello"FS$0}1' file 

Diese Zeichenfolge anhängt nur zu diesen Zeilen, die im letzten Keyword haben.

+1

Danke für die schnelle Antwort. –

1

können Sie diesen awk Befehl verwenden:

awk '/bar$/{$0 = "Hello" FS $0} 1' file 

foo bar baz 
foo bar quux 
Hello foo quux bar 

Diese überprüft, ob eine Zeile mit bar endet und wenn es funktioniert, dann wird es diese Zeile mit String "Hello " Präfix.

Wenn die Zeile nicht mit bar endet, wird diese Zeile so gedruckt, wie sie ist.

+0

Danke für die schnelle Antwort auch. Grundsätzlich die gleiche Antwort wie oben. –

+0

Wie würde ich einen Zeilenumbruch vor der Zeichenfolge _Hello_ hinzufügen? Der Befehl 'awk '/ bar $/{$ 0 = $ 0" \ nHallo "FS $ 0} 1' Datei 'generiert keinen solchen Zeilenumbruch, und ich bin mir nicht sicher, warum nicht. –

+0

Das funktioniert bei mir und fügt einen Zeilenumbruch vor 'Hallo' ein. – anubhava

1

Mit sed:

$ sed 's/.* bar$/Hello &/' infile 
foo bar baz 
foo bar quux 
Hello foo quux bar 

Der Raum vor bar sicher macht Linien in foobar endet nicht entsprechen; es würde für Linien brechen, die bar und nichts anderes, obwohl enthalten.

Mit awk, wenn Sie foo und nicht foobar übereinstimmen soll:

$ awk '$NF == "bar" { $0 = "Hello " $0 }1' infile 
foo bar baz 
foo bar quux 
Hello foo quux bar