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

sed code works in 4.2.1 but not 4.1.5

我有以下适用于 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 正试图将其拼接起来。在您的其中一个系统上,此 globbing 失败并返回原始字符串。在你的其他系统上,它匹配了一些东西,你的替换正则表达式被破坏了。 总是 引用 shell 可能会考虑 "special" 的论点。