当我尝试使用sed命令替换字符串时,它可以正常工作。 例如:
当我使用下面的sed命令时:
sed 's/DB_ALTER/DB_REPRISE/g' /product/dwhrec1/abc.ksh > /product/dwhrec1/abc1.ksh
此命令完全正常,并替换所有" DB_ALTER"与" DB_REPRISE"并将结果写入abc1.ksh脚本。
但是当我将所有这些值放在一个文件中时。例如:
cat Repla.txt
DB_ALTER
DB_CMD
DB_GEST_COMM
for i in `cat Repla.txt`
do
sed 's/$i/DB_REPRISE/g' /product/dwhrec1/abc.ksh > /product/dwhrec1/abc1.ksh
done
但这不起作用。在我的文件中,Repla.txt只是一个例子。实际上它有很多价值。 任何人都可以帮助我这个命令或建议一些替代方案。 感谢
答案 0 :(得分:1)
您的脚本有两个问题。第一个是$i
变量出现在单引号内。这意味着bash不会替代i
的值。它需要是双引号。
其次,每次运行sed
时,它都会覆盖以前的abc1.ksh文件。您应该将abc.ksh
复制到abc1.ksh
,然后根据需要多次修改abc1.ksh
:
cp abc.ksh abc1.ksh
for i in `cat Repla.txt`; do
sed -i'' "s/$i/DB_REPRISE/g" abc1.ksh
done
-i
的{{1}}标志会导致它修改文件。
此外,bash会将分词应用于sed
。这可能会让那些期望它逐行工作的人感到惊讶,而不是逐字逐句。
cat Repla.txt
不支持sed
linux (GNU)和Mac OSX (BSD)上的-i
支持sed
。如果您的-i
没有,请尝试:
sed
上面将您需要的所有替换命令放在一个shell变量中。这样,cmd=
for i in `cat Repla.txt`; do
[ "$cmd" ] && cmd="$cmd;"
cmd="$cmd s/$i/DB_REPRISE/g"
done
sed "$cmd" abc.ksh >abc1.ksh
只需要运行一次,并且不使用sed
。
如果可以覆盖源文件,那么:
-i
除了我们希望shell扩展的部分之外,上面的所有for i in $(cat Repla.txt)
do
sed 's/'$i'/DB_REPRISE/g' abc.ksh >abc1.ksh
mv -f abc1.ksh abc.ksh
done
命令都用单引号括起来。在此示例中不需要这样做,但如果替换文本具有shell活动字符,则可能很有用。上面还使用了更现代的sed
代替反引号进行命令替换。
如果$(...)
包含空格(它不在这里),我们需要用双引号将其括起来以防止shell字拆分,如下所示:
$i