为什么即使使用 grep -F 我也需要转义美元符号

为什么即使使用 grep -F 我也需要转义美元符号
# minimal example file
printf "hey\$you\nhey\$me\n" > test
cat test
# hey$you
# hey$me

简单grep来说:

grep -F "hey$you" test
# hey$you
# hey$me

即,当只有第一行应该匹配时,两行都匹配。

如果我逃脱$,它会按预期工作:

grep -F "hey\$you" test
# hey$you

然而,这违背了我的理解-F/--fixed-strings

将模式解释为一组固定字符串(即强制grep表现为fgrep)。

也没有什么man fgrep特别$的。

在 macOS 和 Ubuntu 上复制

答案1

正在扩展$you为(可能为空)变量,因为您使用了“弱”(双)引用。

您可以通过设置 shell 的x选项来确认这一点:

$ grep -F "hey$you" test
+ grep --color=auto -F hey test
# hey$you
# hey$me

正如您所看到的,"hey$you"变得简单hey- 与两行相匹配。

相反,在模式周围使用强(单)引号:

$ grep -F 'hey$you' test
+ grep --color=auto -F 'hey$you' test
# hey$you

相关内容