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)
为什么?那场比赛怎么样?
这似乎是正则表达式的GNU扩展.反引号('\`')锚点匹配主题字符串的开头,这解释了为什么它匹配所有行.OS X显然没有实现GNU扩展,这可以解释为什么你的例子与那里的任何行都不匹配.见http://www.regular-expressions.info/gnu.html
如果你想在GNU扩展生效时匹配实际的反引号,这对我有用:
grep '[`]' file
Run Code Online (Sandbox Code Playgroud)
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
,\`
只需转义文字`
,因此它仅匹配包含该字符的输入行。