2016-07-28 5 views
2

Это то, что я бегуперекрывающихся оглавлению соответствия шаблону

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

Выход

,t, 
,b, 

Но я хочу, чтобы получить

,t, 
,c, 
,b, 

(я не хочу, b без предшествующего или c без конечного, подлежащего согласованию)

Потому что [tcb] следует найти в «r», t, «c, qb, b, '' r, t", c, "qb, b, 'и' r, t, c, qb" , б, "»

Но, кажется, что, когда, входит в первом матче шаблон затем Grep не ищет этого во втором случае матча картины

есть ли способ обойти это или Grep не имел в виду, чтобы сделать это

+1

'grep' потребляет входные данные. Это означает, что когда 'grep' принимает', t, '', 'перед' c' уже потребляется, поэтому следующий токен 'c,' не подходит. У @anubhava уже есть решение, прежде чем я смогу опубликовать его. – alvits

ответ

3

Вы можете использовать awk вместо grep за это разделитель записей в качестве запятой:

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

,t, 
,c, 
,b, 
1

Решение awk приятно. У меня есть еще один с SED + Grep:

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

,t, 
,c, 
,b, 
1

Вы можете использовать grep с Perl RE, что позволяет модели без захвата Двойник позади и прогнозные, чтобы извлечь письма, окруженными запятыми. Затем вы можете восстановить разделители так же, как вам нужно:

grep -o -P '(?<=,)[tcb](?=,)' <<< "r,t,c,q,c b,b,"|while read c; do echo ",$c,"; done 
Смежные вопросы