bash 中的 sed 不起作用

bry*_*yan 3 bash sed string

我正在尝试使用 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"
Run Code Online (Sandbox Code Playgroud)

这应该有效!但不知何故,在我要编辑的文件中有一个名为“bryan”的名称,我想将其编辑为“bryan name”。我已经将旧名称放在一个我需要明显输入的变量中,并将新名称放在一个变量中。有人可以向我指出为什么它不起作用吗?

Lat*_*SuD 6

只需使用双引号而不是单引号。(单引号不允许变量扩展)。

echo "name to change"
read updatenaamold
echo "enter new name:"
read updatenaamnew
sed -i "s/$updatenaamold/$updatenaamnew/g" $naam_dir
echo "name changed"
Run Code Online (Sandbox Code Playgroud)

注意 1:如果$naam_dir是目录,它也不起作用。Afaiksed在逐个文件的基础上工作。

注意 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' )
Run Code Online (Sandbox Code Playgroud)

在 sed 之前添加它。它将删除字母和数字以外的字符(无空格、无国际字符等)。另一种方法是在发现奇怪的字符时中止(并防止意外错误)。