针对重叠的模式匹配进行擦除

这就是我正在运行

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

输出是

 ,t, ,b, 

但我想得到

 ,t, ,c, ,b, 

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

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

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

有没有办法解决这个问题,或者是grep不是为了做到这一点

你可以使用awk而不是grep来为记录分隔符作为逗号:

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

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

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

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

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