重叠模式匹配的Grepping

时间:2016-07-28 20:43:19

标签: regex unix grep

这就是我正在运行的

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中找到“b”,“

但似乎当第一个模式匹配中包含,那么grep在模式匹配的第二个实例中不会查找这个

有没有办法绕过这个或者grep并不意味着这样做

3 个答案:

答案 0 :(得分:3)

您可以使用awk代替grep,记录分隔符为逗号:

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

,t,
,c,
,b,

答案 1 :(得分:2)

您可以将grepPerl RE一起使用,这样可以使用非捕获的后视和前瞻模式来提取逗号所包围的字母。然后,您可以按照以下方式恢复分隔符:

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

答案 2 :(得分:1)

awk解决方案很好。我有另一个用sed + grep:

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

,t,
,c,
,b,