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

grep regex with backtick matches all lines

$ cat file
anna
amma
kklks
ksklaii

$ grep '\`' file
anna
amma
kklks
ksklaii

为什么?那场比赛如何运作?

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

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

grep '[`]' file

提供了关键指针,但请注意,它是 序列 \`,而不是 ` 本身 在 GNU 正则表达式.

中充当 输入起始锚点

因此,要匹配指定为 单引号 shell 字符串 的正则表达式中的文字反引号,您不需要任何转义完全,既不使用 GNU grep 也不使用 BSD/macOS grep:

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

当使用 双引号 shell 字符串时 - 你应该 避免 用于正则表达式 ,原因将变得显而易见 - 事情变得更加复杂,因为您必须转义 ` 用于 shell' s 为了将它作为文字传递给 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 逐行处理输入,因此 \`^ start-of-line锚;但是,对于多行输入 - 例如如果您使用 grep -z 一次读取所有行 - \` 仅匹配整个字符串的开头。

到BSD/macOSgrep\`只是简单地转义了一个文字`,所以它只匹配包含那个字符的输入行。