Sed 用UNIX文件中的另一组字符串替换单词

Sed 用UNIX文件中的另一组字符串替换单词,sed,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_COM

当我尝试使用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
但这是行不通的。在我的文件中,Repla.txt只是一个例子。实际上,它有很多值。 任何人都可以在这个命令上帮助我或建议一些替代方案。
谢谢你的脚本有两个问题。第一个是
$i
变量出现在单引号内。这意味着bash不会替换
i
的值。它需要用双引号引起来

其次,每次运行
sed
,它都会覆盖以前的abc1.ksh文件。您应该将
abc.ksh
复制到
abc1.ksh
,然后根据需要多次修改
abc1.ksh

cp abc.ksh abc1.ksh
因为我在'cat Repla.txt';做
sed-i''s/$i/DB_REPRISE/g“abc1.ksh
完成
-i
标志指向
sed
,使其就地修改文件

此外,bash将对
cat Repla.txt
应用分词。这可能会让那些期望它一行一行地工作,而不是一个字一个字地工作的人感到惊讶

如果您的
sed
不支持
-i
和上的
sed
支持
-i
。如果您的
sed
没有,请尝试:

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
上面将您需要的所有替换命令放在一个shell变量中。这样,
sed
只需要运行一次,而不使用
-i

另一种选择 如果可以覆盖源文件,则:

for i in $(cat Repla.txt)
do
    sed 's/'$i'/DB_REPRISE/g' abc.ksh >abc1.ksh
    mv -f abc1.ksh abc.ksh
done
上面将所有的
sed
命令都用单引号引起来,我们希望shell扩展的部分除外。在本例中不需要这样做,但如果替换文本具有shell活动字符,则可能会很有用。上面还使用了更现代的
$(…)
来代替反引号进行命令替换

如果
$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

嗨,谢谢你的回复。但是我得到了以下问题:嗨,谢谢你的回复。但我得到了以下问题:dwhrec1@iu0469:/home/dwhrec1#for i in
cat Repla.txt
==>do=>sed-i''s/$i/DB_REPRISE/g”/product/dwhrec1/DSAlim_WUSG_RGR_USG_PA_BIOS_MF_0739.ksh=>done sed:非法选项--i用法:sed[-n]脚本[文件…]sed[-n][e脚本]…-f脚本[文件…]sed:非法选项--i用法:sed[-n]script[file…]sed[-n][-e script]…[-f script_file]…[file…]@user3568369对此表示抱歉。您使用的是什么操作系统?@user3568369这很不寻常:Mac和Linux上的
sed
都支持
-i
。我添加了一个避免
-I
的替代方案。让我知道进展如何。嗨,当我尝试下面的命令时,效果非常好:)dwhrec1@iu0469:/home/dwhrec1#for i in
cat Repla.txt
==>do=>sed's/'
echo$i
'/DB_REPRISE/g'/product/dwhrec1/abc.ksh>/product/dwhrec1/abc1.ksh=>mv-f/product/dwhrec1/abc1.ksh/product/dwhrec1/abc.ksh=>完成感谢您的帮助。
for i in $(cat Repla.txt)
do
    sed 's/'"$i"'/DB_REPRISE/g' abc.ksh >abc1.ksh
    mv -f abc1.ksh abc.ksh
done