用于在 Bash 中查找双字符的正则表达式

erc*_*rch 11 linux command-line grep bash regular-expression

我正在寻找一个正则表达式,它可以在命令行 (Bash) 上查找文本、列表等中所有出现的双字符。

主要问题:有没有一种简单的方法来查找像aallttttt等这样的序列,其中定义了一个正则表达式来查找相同字符的 n 次出现?我正在寻找的是在非常非常基本的水平上实现这一目标。在命令行上。在 Linux Shell 中。

经过相当多的研究,我得出了以下答案——以及由此产生的问题,因此他们只是给了我一个可能的解决方案的提示。但:

a) (e)grep 和反斜杠问题

  • grep 'a\{2\}' 寻找 aa
  • egrep'a{2}' 寻找 aa

问题:设置反冲的必要性真的与我使用的命令有关吗?如果是这样,任何人都可以提示我在此处使用 (e)grep 时还需要考虑什么吗?

b) 我在这里为我的问题找到了这个答案,尽管这不是我想要的:

grep -E '(.)\1' filename查找具有相同字符出现多次但不询问频率的条目。这与我正在寻找的很接近,但我仍然想设置一些重复。

我可能应该把它分成两个或更多的问题,但是我不想在这里淹没这个很棒的网站。

PS:另一个问题,可能离题了,但是:是in, inside,at还是on the shell. 并且on the command line正确吗?

dep*_*uid 9

这确实是两个问题,应该分开。但由于答案相对简单,我将它们放在这里。这些答案grep专门针对 GNU 。

a)egrep与 相同grep -E。两者都表示应使用“扩展正则表达式”而不是grep的默认正则表达式。 grep普通正则表达式需要反斜杠。

man页面:

基本与扩展正则表达式

在基本的正则表达式中,元字符? , + , { , | , ( , 和)失去了它们的特殊意义;而是使用反斜杠版本\? , \+ , \{ , \| , \( , 和\)

man有关历史惯例和可移植性的更多详细信息,请参阅页面。

b) 使用egrep '(.)\1{N}'并替换N为您希望替换的字符数减去一个(因为点与第一个匹配)。因此,如果要匹配重复四次的字符,请使用egrep '(.)\1{3}'.

  • 请注意,标准 ERE 不支持反向引用,而标准 BRE 支持。所以`grep '\(.\)\1\{3\}'` 是标准的,`grep -E '(.)\1{3}'` 不是。 (4认同)

Scr*_*zer 7

这将查找相同字符的 2 次或多次出现:

grep -E '(.)\1+' file
Run Code Online (Sandbox Code Playgroud)

如果您的 awk 有 -o 选项,这会将每个匹配项打印在新行上。

grep -Eo '(.)\1+' file
Run Code Online (Sandbox Code Playgroud)

要查找恰好有 3 个匹配项的匹配项:

grep -E '(.)\1{2}' file
Run Code Online (Sandbox Code Playgroud)

或 3 个或更多:

grep -E '(.)\1{2,}' file
Run Code Online (Sandbox Code Playgroud)

等等..


编辑

实际上@stephane_chazelas 关于反向引用和-E 是正确的。我已经忘记了。我在 BSD grep 和 GNU grep 中尝试过它,它在那里工作,但它不在其他一些 grep 中。您需要使用以下版本之一..

常规grep版本:

grep '\(.\)\1\{1,\}' file

grep -o '\(.\)\1\{1,\}' file

grep '\(.\)\1\{2\}' file

grep '\(.\)\1\{2,\}' file
Run Code Online (Sandbox Code Playgroud)

-o选项也不是标准的 grep BTW(可能如果您的 grep 理解 -o 它也可以进行反向引用)。


注意grep -E '(.)\1{2,}'文件和grep '\(.\)\1\{2\}'文件如亚历克西斯所示是错误的,应该被忽略。