$ cat file
anna
amma
kklks
ksklaii
$ grep '\`' file
anna
amma
kklks
ksklaii
为什么呢?那场比赛怎么样?
答案 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
,\`
只是转义文字`
,因此它只匹配包含一个文字的输入行。