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

Ank*_*wal 5 regex bash grep gnu-coreutils

$ cat file
anna
amma
kklks
ksklaii

$ grep '\`' file
anna
amma
kklks
ksklaii
Run Code Online (Sandbox Code Playgroud)

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

twm*_*twm 8

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

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

grep '[`]' file
Run Code Online (Sandbox Code Playgroud)


mkl*_*nt0 6

twm 的回答提供了关键的指针,但请注意,在 GNU regexes 中,作为输入开始锚点的序列 \`,而不是` 其本身

因此,要匹配指定为单引号 shell string的正则表达式中的文字反引号,您根本不需要任何转义,无论是 GNUgrep还是 BSD/macOS grep

$ { echo 'ab'; echo 'c`d'; } | grep '`'
c`d
Run Code Online (Sandbox Code Playgroud)

当使用双引号的贝壳串-你应该避免对正则表达式,其原因将成为显而易见的-事情变得更加复杂,因为你必须再逃脱`壳的缘故,以便通过作为文字来传递给它grep

$ { echo 'ab'; echo 'c`d'; } | grep "\`"
c`d
Run Code Online (Sandbox Code Playgroud)

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

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

$ { echo 'ab'; echo 'c`d'; } | grep "\\\`" # !! BOTH \ and ` need \-escaping
ab
c`d
Run Code Online (Sandbox Code Playgroud)

同样,在 shell 的字符串解析之后,grep看到 just \`,对于 GNUgrep来说,它是输入的开始锚点,因此所有输入行都匹配。

  • 还要注意,由于grep通过线处理输入线,\`具有相同的效果^开始-α-的最线锚; 但是,对于多行输入 - 例如,如果您grep -z曾经一次读取所有行 -\`仅匹配整个字符串的开头。

对于 BSD/macOS grep\`只需转义文字`,因此它仅匹配包含该字符的输入行。