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
答案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)
。