我正在尝试使用 bash 中的流编辑器 sed 将文件中的字符串替换为输入的新字符串,目前为止我有以下内容:
echo "name to change"
read updatenaamold
echo "enter new name:"
read updatenaamnew
sed -i 's/$updatenaamold/$updatenaamnew/g' $naam_dir
echo "name changed"
这应该可以!但不知何故,在我想要编辑的文件中,有一个名为“bryan”的名字,我想将其编辑为“bryan name”。我把旧名字放在一个显然需要输入的变量中,把新名字也放在一个变量中。有人能告诉我为什么它不起作用吗?
答案1
只需使用双引号代替单引号。(单引号不允许变量扩展)。
echo "name to change"
read updatenaamold
echo "enter new name:"
read updatenaamnew
sed -i "s/$updatenaamold/$updatenaamnew/g" $naam_dir
echo "name changed"
注 1:如果$naam_dir
是目录,它也不会工作。sed
据我所知,它是逐个文件工作的。
注意 2:如果用户输入特殊字符(如:)/ ^ $ []
,则不会按预期工作,因为它会使 sed 感到困惑。解决方法(不确定这是否是最好的方法):
updatenaamold=$( POSIXLY_CORRECT=1 /bin/echo "$updatenaamold" | sed 's/[^a-zA-Z0-9]//g' )
updatenaamnew=$( POSIXLY_CORRECT=1 /bin/echo "$updatenaamnew" | sed 's/[^a-zA-Z0-9]//g' )
将其添加到 sed 之前。它将删除除字母和数字以外的字符(无空格、无国际字符等)。另一种方法是在发现奇怪的字符时中止(并防止意外错误)。
答案2
由于您正在使用,bash
我建议您使用签出Bash 字符串操作。