Sed 用UNIX文件中的另一组字符串替换单词
当我尝试使用sed命令替换字符串时,它工作得非常好。 例如: 当我使用下面的sed命令时: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 '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 incat 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