带反引号的grep正则表达式匹配所有行

时间:2015-10-23 00:36:00

标签: regex bash grep gnu-coreutils

$ cat file
anna
amma
kklks
ksklaii

$ grep '\`' file
anna
amma
kklks
ksklaii

为什么呢?那场比赛怎么样?

2 个答案:

答案 0 :(得分:8)

这似乎是正则表达式的GNU扩展。反引号('\`')锚点匹配主题字符串的开头,这解释了为什么它匹配所有行。 OS X显然没有实现GNU扩展,这可以解释为什么你的例子与那里的任何行都不匹配。见http://www.regular-expressions.info/gnu.html

如果你想在GNU扩展生效时匹配实际的反引号,这对我有用:

grep '[`]' file

答案 1 :(得分:3)

twm's answer提供关键指针,但请注意它是 序列 \` ,而不是` by本身充当GNU正则表达式中输入开始的锚点

因此,匹配指定为单引号shell字符串的正则表达式中的字面反引号,您根本不需要任何转义,也不需要GNU grep或BSD / macOS grep

$ { echo 'ab'; echo 'c`d'; } | grep '`'
c`d

使用 双引号 shell字符串时 - 您应该 避免正则表达式,原因是变得显而易见 - 事情变得更加复杂,因为你必须逃离 shell `,以便将其作为文字传递给grep

$ { echo 'ab'; echo 'c`d'; } | grep "\`"
c`d

请注意,在shell解析了"..."字符串后,grep仍然只能看到`

使用带有GNU grep双引号字符串重新创建原始命令:

$ { echo 'ab'; echo 'c`d'; } | grep "\\\`" # !! BOTH \ and ` need \-escaping
ab
c`d

再次,在shell的字符串解析之后,grep仅看到\`,其中GNU grep是输入的开始锚点,因此所有输入线匹配。

  • 另请注意,由于grep逐行处理输入,因此\`^ 行开始的锚点效果相同;但是,使用多行输入 - 例如,如果您使用grep -z一次读取所有行 - \`仅匹配整个字符串的开头。

对于BSD / macOS grep\`只是转义文字`,因此它只匹配包含一个文字的输入行。

相关问题