我需要更改配置文件中的指令并使其在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的内容,但不适用于其他内容。
答案 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它,将输出重定向到目标。