2016-07-28 6 views
2

Dies ist, was ichgreppen für Muster überlappende Spiele

grep -o ',[tcb],' <<< "r,t,c,q,c b,b," 

Der Ausgang ist

,t, 
,b, 

Aber ich will

,t, 
,c, 
,b, 

bekommen renne (Ich will nicht die b ohne eine vorangehende, oder die c ohne eine nachfolgende,

Weil, [tcb], in 'r', t ',' c, qb, b ',' r, t '', 'c', 'qb, b' und 'r, t, c, qb' gefunden werden sollte , b ",‘

Aber es scheint, dass, wenn die in der ersten Mustererkennung enthalten ist, dann grep nicht dafür sieht in der zweiten Instanz des Musters Spiel

gibt es eine Möglichkeit, um dieses oder ist grep nicht diese

+1

'grep' verbraucht die Eingabe. Was das bedeutet, ist, wenn 'grep'' '' '' '' '' '' '' '' '' ''' 'bereits verbraucht ist. Daher ist das nächste Token' 'c \' nicht qualifiziert. @anubhava hat bereits eine Lösung, bevor ich eine veröffentlichen kann. – alvits

Antwort

3

Sie awk für diese statt grep können vorhatte mit voneinander zu trennen sind als Komma:

awk -v RS=, '/^[tcb]$/{print RS $0 RS}' <<< "r,t,c,q,c b,b," 

,t, 
,c, 
,b, 
1

Die awk Lösung ist nett. Ich habe eine andere mit sed + grep:

echo "r,t,c,q,c b,b," | sed "s/,/,,/g" | grep -o ',[tcb],' 

,t, 
,c, 
,b, 
1

Sie grep mit einem Perl RE verwenden, die Nicht-Erfassung Blick hinter und Look-Ahead-Muster, die durch Kommata umgeben Buchstaben zu extrahieren. Sie können die Separatoren dann genau so wiederherstellen, wie Sie sie brauchen:

grep -o -P '(?<=,)[tcb](?=,)' <<< "r,t,c,q,c b,b,"|while read c; do echo ",$c,"; done