Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex Bash:如何为同一字符串的多个实例grep一行?_Regex_Bash_Grep - Fatal编程技术网

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
*
将匹配2
xz
之间的可选字符(除换行以外的任何字符)

如果需要使用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 reference
grep-E'(..)。*\1'
将匹配任何两个字符重复的位置,但这不是这里所要求的,,,,我想我在阅读“xz”时,没有看到任何其他的“x”或“z”。不过你是对的。
grep 'xz.*xz' filename