Regex Bash:如何为同一字符串的多个实例grep一行?
我有几行是这样的:Regex Bash:如何为同一字符串的多个实例grep一行?,regex,bash,grep,Regex,Bash,Grep,我有几行是这样的: aaaaaaaaxzaaaaaaaaaaaaaa bbbbbbbbbbbbxzbbbbbbxzbb ccxzcccccccccccccccccxzc dddddddxzddddddddddddddd 在其中两行中,有两个xz字符的实例。我希望grep在同一行中查找两次xz,并输出匹配的行。如果xz出现一次,我不想知道 运行以下命令: cat lines | grep "xz" 告诉我xz打开的每一行,但我只想看到xz出现两次 如何使模式搜索在同一行中重复?您可以使用 ca
aaaaaaaaxzaaaaaaaaaaaaaa
bbbbbbbbbbbbxzbbbbbbxzbb
ccxzcccccccccccccccccxzc
dddddddxzddddddddddddddd
在其中两行中,有两个xz
字符的实例。我希望grep在同一行中查找两次xz
,并输出匹配的行。如果xz
出现一次,我不想知道
运行以下命令:
cat lines | grep "xz"
告诉我xz打开的每一行,但我只想看到xz出现两次
如何使模式搜索在同一行中重复?您可以使用
cat lines | grep 'xz.*xz'
或者只是
grep 'xz.*xz' lines
*
将匹配2xz
之间的可选字符(除换行以外的任何字符)
如果需要使用look arounds,则需要使用-p
开关来启用类似Perl的regexp。awk是一种方法:
awk -F'xz' 'NF==3' file
或
awk给您带来的另一个好处是,更容易检查匹配的模式
小于n次
,精确n次
或大于n次
。您只需将=
更改为=
,如果您想完整输出匹配行,则不需要这些选项
grep 'xz.*xz' filename
将执行
cat行| grep-oP'xz.
?这很有效,Stribizev,感谢您不需要-p
或-o
。这不会打印整行,相反,它会打印许多匹配的模式,因为-o
还有一个问题,oP提到了两个实例。如果一行有三个(或更多)xz
,您的grep也会将其打印出来。请解决这不是一个大问题。只需要两个xz
就可以得到一行的正则表达式是。从OP的反馈来看,似乎至少应该有2个xz
。如果你想在上面的模式中使用grep
,请使用grep-P'^(?:(?:(?:(?!xz)。*xz){2}(?:(?!xz)。*$文件
。如果你想要两个相同的字符串呢?尝试模式[x-z]\{2\}
,您将看到“xy abc yx”与“xy abc xy”一样匹配。一般来说,我认为解决方案应该只涉及指定要匹配一次的模式。我可以做到这一点,但到目前为止还不能用简单的模式匹配。您所描述的可以用back referencegrep-E'(..)。*\1'
将匹配任何两个字符重复的位置,但这不是这里所要求的,,,,我想我在阅读“xz”时,没有看到任何其他的“x”或“z”。不过你是对的。
grep 'xz.*xz' filename