适用于Solaris,Linux和HPUX的sed命令

时间:2013-05-23 22:00:56

标签: linux shell sed solaris hp-ux

我需要更改配置文件中的指令并使其在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的内容,但不适用于其他内容。

3 个答案:

答案 0 :(得分: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 

答案 1 :(得分: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

答案 2 :(得分:0)

GNU [[:space:]]通常只相当于[ \t]。你需要逃避括号。并且不支持+。因此,通过这些替换,您的sed命令变为:

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

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