我正在尝试编写一份Shell脚本,使用sed命令替换我选择的任意字符/字符串。我的第一次尝试已经成功了,但是碰到了特殊字符的问题。我一直在尝试使用sed来解决特殊字符的问题,以便对其进行搜索或替换。为测试目的简化脚本后,只处理一个有问题的字符。然而,我仍然遇到了问题。
编辑后的脚本:
如果不清楚的话,我正在尝试在 oldString 中搜索 [ 字符,并用转义版本替换它,然后将结果分配给 oldStringFixed(这需要加上反引号吗?)。最后两行是我原始脚本的稍微修改版本,我相信它们能正确工作。
当我 echo 固定的字符串时,没有显示任何内容,并且 sed 输出了错误。
编辑后的脚本:
#! /bin/sh
oldString=$1
newString=$2
file=$3
oldStringFixed=$(echo "$oldString" | sed 's/\\/\\\\/g')
oldStringFixed=$(echo "$oldStringFixed" | sed 's/\[/\\\[/g')
oldStringFixed=$(echo "$oldStringFixed" | sed 's/\]/\\\]/g')
oldStringFixed=$(echo "$oldStringFixed" | sed 's/\^/\\\^/g')
oldStringFixed=$(echo "$oldStringFixed" | sed 's/\*/\\\*/g')
oldStringFixed=$(echo "$oldStringFixed" | sed 's/\+/\\\+/g')
oldStringFixed=$(echo "$oldStringFixed" | sed 's/\./\\\./g')
oldStringFixed=$(echo "$oldStringFixed" | sed 's/\$/\\\$/g')
oldStringFixed=$(echo "$oldStringFixed" | sed 's/\-/\\\-/g')
sed -e "s/$oldStringFixed/$newString/g" "$file" > newfile.updated
mv newfile.updated "$file"#! /bin/sh
如果不清楚的话,我正在尝试在 oldString 中搜索 [ 字符,并用转义版本替换它,然后将结果分配给 oldStringFixed(这需要加上反引号吗?)。最后两行是我原始脚本的稍微修改版本,我相信它们能正确工作。
当我 echo 固定的字符串时,没有显示任何内容,并且 sed 输出了错误。
sed: can't read [: No such file or directory
有人能解释一下我第一行sed命令错在哪里吗?
编辑:
感谢Jite,脚本现在运行得更好了。但是我仍然无法用空格替换单引号字符,即' *'。 新版本如上所示。