erc*_*rch 11 linux command-line grep bash regular-expression
我正在寻找一个正则表达式,它可以在命令行 (Bash) 上查找文本、列表等中所有出现的双字符。
主要问题:有没有一种简单的方法来查找像aa
、ll
、ttttt
等这样的序列,其中定义了一个正则表达式来查找相同字符的 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
正确吗?
这确实是两个问题,应该分开。但由于答案相对简单,我将它们放在这里。这些答案grep
专门针对 GNU 。
a)egrep
与 相同grep -E
。两者都表示应使用“扩展正则表达式”而不是grep
的默认正则表达式。 grep
普通正则表达式需要反斜杠。
从man
页面:
基本与扩展正则表达式
在基本的正则表达式中,元字符? , + , { , | , ( , 和)失去了它们的特殊意义;而是使用反斜杠版本\? , \+ , \{ , \| , \( , 和\)。
man
有关历史惯例和可移植性的更多详细信息,请参阅页面。
b) 使用egrep '(.)\1{N}'
并替换N
为您希望替换的字符数减去一个(因为点与第一个匹配)。因此,如果要匹配重复四次的字符,请使用egrep '(.)\1{3}'
.
这将查找相同字符的 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\}'
文件如亚历克西斯所示是错误的,应该被忽略。