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问题吗?并有它的解决方案?

+1

你有一个答案,但我很好奇你的症状:你真的得到了'sed:没有匹配。'?这看起来不像一个Sed错误消息;它可能是'bash:不匹配:s /.* VERSION = //'?如果'shop -s failglob'碰巧生效,则会导致_shell_尝试将该模式与当前目录中的文件进行匹配失败。 (由于没有被引用)。 – mklement0

由于您没有引用星号,因此您的shell正在尝试对其进行填充。在你的一个系统上,这个通配符失败并返回原始字符串。在你的其他系统上它匹配一些东西,你的替换正则表达式被销毁。 总是引用shell认为“特殊”的论点。

我发现sed 4.1.5需要单引号才能使其工作。以下作品。

echo ab | sed 's/.*//' 

但是sed 4.2.1不需要这个。

+2

这不是sed,它是通过它。这是壳。您可能会在旧系统上关闭glob并在较新的系统上打开。 – alvits