grep 与正则表达式找不到匹配项

grep 与正则表达式找不到匹配项

该数字不能以 0 开头。

我用 reg ex 运行了这个 grep 命令

❯ echo "#time 1m" | grep -E -o "#time\s(?!0)\d{1,2}[m|h|d]"

并得到以下输出:

zsh: event not found: 0

我在图形注册表扩展测试器中的尝试显示了一个匹配项:在此输入图像描述

答案1

zsh: event not found: 0

这是因为 shell 将 视为!历史扩展的触发器。将字符串放在单引号中,或者使用set +o histexpand(或setopt nohistexpand在 zsh 中,或set +H在 Bash 中)禁用历史扩展。参见例如理解 bash 中的感叹号 (!)

... grep -E -o "#time\s(?!0)\d{1,2}[m|h|d]"

请注意\s, 、(?!...)、 和\d是 Perl 正则表达式的一部分,而不是grep -E使用的标准扩展正则表达式。此外,还匹配、、或[m|h|d]之一的任何单个字符。最好写成这样,但你可能是指(或者这只是一种更长的写法)。m|hd[mhd|][mhd](m|h|d)

您可能必须将正则表达式重写为标准 ERE,或者切换到可以使用 Perl 正则表达式的工具,例如grep -PGNU grep。

为什么我的正则表达式在 X 中有效但在 Y 中无效?

答案2

这与RE无关。这是允许 shell 看到字符串内部并尝试对其进行评估。 (这就是为什么错误消息以 开头zsh,而不是grep.)为了防止这种情况,请使用单引号 ( ') 而不是双引号 ( ")

相关内容