sed代码适用于4.2.1,但不适用于4.1.5

sed代码适用于4.2.1,但不适用于4.1.5,sed,rhel,suse,Sed,Rhel,Suse,我有以下适用于RH6和sed 4.2.1的sed代码 >> 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 但它在SUSE 11和sed 4.1.5中失败 >> echo "SUSE Lin

我有以下适用于RH6和sed 4.2.1的sed代码

>> 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
但它在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的已知问题吗?它有解决办法吗

我发现sed 4.1.5需要单引号才能正常工作。下面的工作

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

但是sed 4.2.1不需要这个。

因为您没有引用星号,所以您的shell正在尝试将其全局化。在您的一个系统上,此全局绑定失败,并返回原始字符串。在您的另一个系统上,它匹配某些内容,并且您的替换正则表达式被销毁。总是引用shell可能认为特殊的参数。

这不是SED正在对它进行格式化。是贝壳。您可能在较旧的系统上关闭了glob,在较新的系统上打开了glob。您有一个答案,但我对您的症状感到好奇:您真的得到sed吗:不匹配。?这看起来不像Sed错误消息;是否可能是bash:no匹配:s/*VERSION=//?如果shopt-s failglob恰好有效,那么您就会得到它,这是由于shell尝试将该模式与当前目录中的文件匹配失败所致。因为没有报价。