寻找重叠的模式匹配:使用grep命令在IT技术中寻找重叠的模式匹配。

3

这是我正在运行的内容

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

输出结果为:
,t,
,b,

但是我想获取

,t,
,c,
,b,

我不希望匹配前面没有逗号的 b,或者后面没有逗号的 c

因为 [tcb] 应该出现在 'r",t,"c,q b,b,'、'r,t",c,"q b,b,' 和 'r,t,c,q b",b,"' 中

但是当第一个模式匹配中包含逗号时,grep 似乎不会在第二个模式匹配中查找它

是否有解决办法,或者 grep 不应该这样做?


1
grep 消耗输入。这意味着当 grep 获取 ,t, 时,逗号 ,c 之前已经被消耗,因此下一个标记 c, 不符合条件。@anubhava 在我发布解决方案之前已经有了一个解决方案。 - alvits
3个回答

3
您可以使用 awk,并将记录分隔符设置为逗号,来替代 grep 来完成此操作:
awk -v RS=, '/^[tcb]$/{print RS $0 RS}' <<< "r,t,c,q,c b,b,"

,t,
,c,
,b,

2

您可以使用与 Perl 正则表达式配合的 grep 命令来提取被逗号包围的字母。这种方法允许非捕获式向前或向后查找模式。然后,您可以按照需要恢复分隔符:

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

1

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

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

,t,
,c,
,b,

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接