2016-08-17 2 views
1

Ich bin ein bisschen fest auf einem sed ersetzen Problem. Ich habe eine durch Tabulatoren getrennte Datei, die etwa wie folgt aussieht:Sed ersetzt durch erste Zeichen in der Zeile

stuff1 \t names names names 
stuff2 \t \t names names names 
stuff3 \t \t names names names 
stuff4 \t names names names 

Was würde ich tun möchte, ist die Doppel Registerkarten in einer Art und Weise ersetzen, dass sie das erste Wort zwischen ihnen würde ein. Wie folgt aus:

stuff2 \t stuff2 \t names names names 
stuff3 \t stuff3 \t names names names 

Was ich versucht war

sed 's/\t\t/\t(.*\t\t\)\t/' 

aber wenn ich versuche, es zu ersetzen mit der Ausreißergruppe, dauert es sie buchstäblich und ändert sich bei jedem Auftreten von

\t\t 

zu

\t(.*\t\t\)\t 

Gibt es eine Möglichkeit, der Fluchtgruppe zu entkommen?

Antwort

1

Gerade sie wie folgt überein:

$ sed -r 's/^(\S+)\t\t/\1\t\1\t/g' file 
stuff1 names names names 
stuff2 stuff2 names names names 
stuff3 stuff3 names names names 
stuff4 names names names 

Dies ist:

  • s/find/replacement/g
    der volle Ausdruck find und ersetzen sie durch replacementg lobally zu finden.
  • ^(\S+)\t\t
    den Anfang der Zeile gefolgt von einem Wort (Sie könnten auch sagen [^\t]*). Passen Sie dann zwei Registerkarten an.
  • \1\t\1\t
    Ersetzen Sie dies durch die erfasste Übereinstimmung gefolgt von einer Registerkarte und dann wieder.
  • -r
    diese sed Flag wird verwendet, erweitert regexp zu haben, die es Ihnen ermöglichen, mit nur (...) statt \(...\) eine Gruppe zu fangen.

By the way, zu mir, der Ausgang des Befehls lautet:

$ sed 's/\t\t/\t(.*\t\t\)\t/' file 
stuff1 names names names 
stuff2 (.* ) names names names 
stuff3 (.* ) names names names 
stuff4 names names names 

Da Sie .* im Ersatzteil verwenden, so ist es buchstäblich und nicht als reguläres genommen Ausdruck.

+1

Ah, vielen Dank! –

Verwandte Themen