2016-07-28 95 views
2

这就是我正在Grepping重叠模式匹配

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

输出是

,t, 
,b, 

但我想

,t, 
,c, 
,b, 

(我不希望b没有前面,或c没有尾随)匹配)

因为在[r],t,“c,qb,b,'r,t”,c,“qb,b”和“r,t,c,qb”中应该找到[tcb] ,b“,”

但似乎时,包括在第一图案匹配,则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

可以使用grepPerl RE,允许非捕获向后看和前瞻模式,以提取由逗号包围字母。然后,您可以按照以下方式恢复分隔符:

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