2

我需要更改配置文件中的指令并让它在 Linux 中工作,但在 Solaris 中,它说命令乱码。

这是指令

    enable-cache            passwd          yes

我需要简单地将是更改为否。如何使用适用于 Solaris、HPUX 和 Linux 的 sed?

这是在 Linux 中工作的 sed 命令。Solaris 不喜欢 -r

sed -r 's/^([[:space:]]*check-files[[:space:]]+passwd[[:space:]]+)yes([[:space:]]*)$/\1no\2/' inputfile

最终目标是将这个命令放在一个脚本中并在整个企业中运行。

谢谢

格雷格

我昨天也发布了类似的东西,它适用于 Linux,但不适用于其他人。

4

3 回答 3

2

Solaris 有 /usr/bin/sed 和 /usr/xpg4/bin/sed。这些都不支持 -r 选项,Linux 的选项是使用扩展的正则表达式。Solaris 中的 sed 没有任何选项来设置这样的正则表达式。如果您想要更简单的可移植性,您可以使用其他工具,特别是 awk。或者您将不得不使用两种风格的正则表达式,一种带有 -r 和扩展正则表达式,一种没有 -r 和不同的正则表达式。您可能只想在 Solaris 机器上指定 /usr/xpg4/bin/sed:

#!/bin/bash
sun=`expr index Solaris $(uname -a)`
if [ $sun -ne 0 ] ; then
   /usr/xpg4/bin/sed [longer regex here ] 
else
  /usr/bin/sed -r [ extended regex here ]
fi 
于 2013-05-23T23:06:18.050 回答
0

这与匹配更多字符并不完全等效,:space:但我假设您的文件中只需要空格和制表符。我只使用标准的 shell 和 sed 命令,所以这应该适用于 Solaris、Linux 和 HP-UX:

space=$(printf " \t")
sed 's/^\(['"$space"']*check-files['"$space"']+passwd['"$space"']+\)yes\(['"$space"']*\)$/\1no\2/' inputfile

请注意,您的脚本与预期的示例指令不匹配,check-files而是给出了enable-cache.

于 2013-05-23T23:05:57.390 回答
0

GNU[[:space:]]通常等同于[ \t]. 你需要转义括号。并且+不支持。因此,通过这些替换,您的工作sed命令变为:

sed 's/^\([ \t]*check-files[ \t][ \t]*passwd[ \t][ \t]*\)yes\([ \t]*\)$/\1no\2/' inputfile

进一步注意:较旧的sed's没有-i进行就地更改的选项,因此您可能首先必须将目标复制到临时文件,然后应用sed到它,将输出重定向到目标。

于 2013-06-27T02:18:50.653 回答