将单词替换为UNIX文件中的另一组字符串

时间:2014-04-30 06:52:01

标签: sed

当我尝试使用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只是一个例子。实际上它有很多价值。 任何人都可以帮助我这个命令或建议一些替代方案。 感谢

1 个答案:

答案 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