SED代码在4.2.1但不是4.1.5
问题描述:
我在RH6工作和sed 4.2.1SED代码在4.2.1但不是4.1.5
>> echo "SUSE Linux Enterprise Server 11 (x86_64) VERSION = 11 PATCHLEVEL = 2" | sed s/.*VERSION\ =\ //
11 PATCHLEVEL = 2
>> sed --version
GNU sed version 4.2.1
下面的sed代码,但它在SUSE 11失败和sed 4.1.5
>> echo "SUSE Linux Enterprise Server 11 (x86_64) VERSION = 11 PATCHLEVEL = 2" | sed s/.*VERSION\ =\ //
sed: No match.
>> sed --version
GNU sed version 4.1.5
我发现下面的代码在两个版本中的工作方式不同。 SUSE中的sed 4.1.5无法匹配任何内容。
echo ab | sed s/.*//
这是一个已知的sed问题吗?并有它的解决方案?
答
由于您没有引用星号,因此您的shell正在尝试对其进行填充。在你的一个系统上,这个通配符失败并返回原始字符串。在你的其他系统上它匹配一些东西,你的替换正则表达式被销毁。 总是引用shell认为“特殊”的论点。
答
我发现sed 4.1.5需要单引号才能使其工作。以下作品。
echo ab | sed 's/.*//'
但是sed 4.2.1不需要这个。
+2
这不是sed,它是通过它。这是壳。您可能会在旧系统上关闭glob并在较新的系统上打开。 – alvits
你有一个答案,但我很好奇你的症状:你真的得到了'sed:没有匹配。'?这看起来不像一个Sed错误消息;它可能是'bash:不匹配:s /.* VERSION = //'?如果'shop -s failglob'碰巧生效,则会导致_shell_尝试将该模式与当前目录中的文件进行匹配失败。 (由于没有被引用)。 – mklement0