grep 找不到曾经工作的转义破折号



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

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 中,范围表达式中的反斜杠并不特殊:

<backslash>应是特殊的,除非在括号表达式中使用

或者,由于您的正则表达式范围实际上意味着"之间的所有字符,加上管道和数字",因此您可能一直在使用区域设置,认为-等同于排序规则顺序中的。我无法使用系统上的任何语言环境重现此问题。

但在命令行上工作正常

其实不然。由于您没有引用字符串,因此 shell 会删除反斜杠。以下是grep最终看到的内容:

$ printf '%sn' ^abc[-|0-9]
^abc[-|0-9]

最新更新