bash 中的 sed 不起作用

bash 中的 sed 不起作用

我正在尝试使用 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 字符串操作

相关内容