2016-10-05 1 views
2

Ich habe die folgende Textdatei mit den folgenden Zeilen:grep sed, nach String Match hängen, sondern auf Zeilenende

<test="123"> 
<test="456"> 
<test="789"> 

Mein Ziel ist es, die oben Textdatei zu haben, mit einem Schlüsselwort angehängt werden „HALLO“ nach den oben genannten Zahlen, wie folgend:

<test="123.HELLO"> 
    <test="456.HELLO"> 
    <test="789.HELLO"> 

mit dem Befehl grep und geschnitten, schaffe ich es, den Wert zwischen den Anführungszeichen zu bekommen.

grep -o "test=".* test.txt | cut -d \" -f2 

Ich habe versucht, auf es zu benutzen sed, mit dieser Linie

grep -o "test=".* test.txt | cut -d \" -f2 | sed -i -- 's/$/.HELLO/' test.txt 

aber die nächste, die ich zu bekommen verwalten, ist stattdessen ein „.HELLO“, die am Ende der Zeile direkt angehängt (und nicht nach den Zahlen zwischen den Anführungszeichen)

<test="123">.HELLO 
<test="456">.HELLO 
<test="789">.HELLO 

Wie kann ich meine sed Aussage beheben mich mit der gewünschten Linie zu schaffen?

+0

können Sie klären: 1) Plätze vor der erwarteten Ausgangsleitungen benötigt wird oder falsch hier wegen der Formatierung 2 dargestellt) wird die Eingabedatei enthalten Zeilen nicht 'Test enthält ='? wenn ja, sollten sie auch Teil der Ausgabe sein – Sundeep

Antwort

1

Sie können es mit Gruppen in sed tun. Um neue Ausgabe zu erstellen, können Sie dies tun:

sed 's/\(test="[^"]*\)"/\1.HELLO"/g' test.txt 

ändern es an Ort und Stelle, können Sie die -i Schalter verwenden:

sed -i 's/\(test="[^"]*\)"/\1.HELLO"/g' test.txt 

Erläuterung:

  • () ist eine Gruppe . Sie können sich darauf beziehen mit \1. In sed müssen wir den Klammern entgehen: \(\)
  • [^"]* passt alles, was kein Zitat ist. Das Match wird also vor dem Angebot gestoppt
  • In der Ersetzung müssen Sie das Zitat manuell hinzufügen, da es außerhalb der Gruppe ist. Sie können also Dinge vor dem Angebot platzieren.
1

Sie können dies mit sed direkt erreichen. Cut sollte nicht nötig sein:

grep "test=" test.txt | sed 's/"\(.*\)"/"\1.HELLO"/' 
+1

Grep ist auch nicht notwendig, sowie '-o' Option sollte in diesem Fall nicht verwendet werden .. und Sie könnten einige Beispiel-Dateinamen zu Grep Befehl hinzufügen ... – Sundeep

+1

Guter Anruf , hat meine Antwort bearbeitet.Ich habe Grep reingelassen, für den Fall, dass in der Datei, die der OA ausgelassen hat, Fremdzeilen vorhanden sind. Natürlich könnte es direkt mit sed gemacht werden, aber das scheint einfacher. –

+0

jetzt gut :) 'sed -n '/ test =/s /" \ (. * \) "/" \ 1.HELLO "/ p' test.txt' ist auch einfach, aber ich verstehe deinen Punkt :) – Sundeep

1

Try this:

Dies ist, wie Sie Ihre Datei aussieht.

bash > cat a.txt 
<test="123"> 
<test="456"> 
<test="789"> 

Ihr Text zum Ausleiten SED

bash > cat a.txt |sed 's/">/.HELLO">/g' 
<test="123.HELLO"> 
<test="456.HELLO"> 
<test="789.HELLO"> 
bash > 

Lassen Sie mich wissen, ob dies für Sie ausgearbeitet.

1
awk 'sub("[0-9]+","&.HELLO")' file