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]
我有特定的字符串,后跟破折号“-”、竖线“|”或数字
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]