引用你的表达。

引用你的表达。
grep ab* filename.txt

上述命令查找a以任意数量的b' 开头和结尾的行。例如:

a
ab
abb
abb

但是我该如何修复我的命令以便它能找到这样的行呢?

ab
abab
abababab

我试过了grep (ab)* filename.txt,但是它不行,因为它与 相同(ab | (ab) | (ab))

答案1

grep (ab)* filename.txt

上面的那个不会这样做,因为它与 (ab | (ab) | (ab)) 相同。

不,它不起作用,因为()对于大多数 shell 来说它是特殊的,并且您会收到语法错误:

$ grep (ab)* foo
bash: syntax error near unexpected token `('

引用你的表达。

现在,grep默认使用基本正则表达式 (BRE)。要在 BRE 中对表达式的一部分进行分组,您需要使用\(...\)

$ echo xababx | grep -o '\(ab\)*'
abab

或者使用扩展正则表达式(ERE)或 Perl 兼容正则表达式(PCRE),其中(...)就足够了:

$ echo abab | grep -Eo '(ab)*'
abab
$ echo abab | grep -Po '(ab)*'
abab

grepBRE 与 ERE 手册

答案2

$ more ~/tmp/test_grep.txt
ab
abab
abababab
abaab
aba

$ grep -e '^\(ab\)\+$' ~/tmp/test_grep.txt
ab
abab
abababab

-e选项是使用正则表达式。表达式是^(ab)+$, 表示^在行首的开始,+表示重复该组(ab), 表示$在 之后结束(ab)

相关内容