Spielmuster N-mal sedieren

14

Ich möchte eine Datei in Stücke mit jeweils 2 Wörtern aufteilen.

$cat tmp
word1 word2 word3 word4 word5 word6 word7
$sed -e 's/word. word. /&\n/g' tmp
word1 word2 
word3 word4 
word5 word6 
word7
$sed -e 's/word. \{2\}/&\n/g' tmp
word1 word2 word3 word4 word5 word6 word7

Ich habe erwartet, dass der letzte Befehl dasselbe Ergebnis liefert wie der vorherige. Was ist falsch?

user13107
quelle

Antworten:

17

Entschuldigung, es scheint, als hätte ich es gleich nach dem Posten herausgefunden.

Es muss sein

sed -e 's/\(word. \)\{2\}/&\n/g' tmp

Anscheinend werden die Klammern benötigt, damit sed die Bedingung {2} auf das gesamte Muster word.und nicht nur auf das vorangestellte Leerzeichen anwendet .

user13107
quelle
3
oder verwenden Siesed -E 's/(word. ){2}/&\n/g' tmp
Cyrus
1

Ein anderer Weg in sed:

$ sed 's/ /\x1&\x2/g; s/\([^\x1]*[\x1][^\x2]*[\x2][^\x1]*\)[\x1][^\x2]*[\x2]/\1\
/g; s/[\x1\x2]//g'
cuonglm
quelle
scheint sehr kompliziert zu sein. was ist \x?
user13107
1

Für den allgemeinen Fall der N-fachen Übereinstimmung:

$ perl -ple '$N=3;s/(\S+ ){$N}\K/\n/g' tmp
word1 word2 word3 
word4 word5 word6 
word7
Joseph R.
quelle