grep 无法找到曾经有效的转义破折号

grep fails to find escaped dash that used to work

我有特定的字符串,后跟破折号“-”、竖线“|”或数字

8 年前的代码一直用 [-\|0-9]

过滤数据

这个 grep 现在失败了

> cat regex
^abc[\-\|0-9]
> echo abc- | grep -v -f regex
abc-

去掉反斜杠后效果很好

> cat regex
^abc[-\|0-9]
> echo abc- | grep -v -f regex
>

反斜杠在命令行上工作正常!

> echo abc- | grep -v ^abc[\-\|0-9]
>

由于这直接在命令行上工作,因此似乎改变了“-f”将文件加载到程序中的方式?

我已经在 GNU grep 2.20(在 CentOS7 上)和 GNU grep 2.5.1(在 CentOS5 上)验证了这个行为

显而易见的解决方案是只删除反斜杠。我搜索的每个迹象都表明应该允许使用反斜杠。

我真的很想了解为什么它开始失败...但在命令行上运行良好。我无法再使用旧的 linux 盒子进行测试。

如果它曾经起作用,它可能是一个错误。在 POSIX BRE 中,a backslash in ranged expressions is not special:

<backslash> shall be special except when used in a bracket expression

或者,由于您的正则表达式范围实际上表示 "all characters between \ and \, plus pipes and numbers",您可能一直在使用认为 - 等同于 \ 整理顺序的语言环境。我无法在我的系统上使用任何语言环境重现此内容。

but works fine on the command-line

没有。由于您没有引用字符串,因此 shell 删除了反斜杠。这是 grep 最终看到的内容:

$ printf '%s\n' ^abc[\-\|0-9]
^abc[-|0-9]