我正在尝试编写一个
shell脚本,它将替换我使用sed选择的任何字符/字符串.我的第一次尝试使用特殊字符除外.我一直在尝试使用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(我需要反引号吗?).底部两行是我原始脚本的略微修改版本,我相信它可以正常工作.
当我回显固定字符串时,不显示任何内容,并且sed输出错误
sed: can't read [: No such file or directory
谁能解释我的第一个sed线有什么问题?
编辑:
感谢Jite,脚本运行得更好.但是,我仍然遇到用空格替换单引号字符的问题,即’*’.新版本在上面.
解决方法
我建议两个改进:
>不要像你那样堆栈对sed的调用,而是将它们全部打包在一个函数中,如下面的escape_string.
>您可以为sed substitute命令使用精美分隔符,以避免与所涉及的字符串相关联的问题.
通过这些更改,您的脚本如下所示:
#! /bin/sh oldString="$1" newString="$2" file="$3" escape_string() { printf '%s' "$1" | sed -e 's/[][\\^*+.$-]/\\\1/g' } fancyDelim=$(printf '\001') oldStringFixed=$(escape_string "$oldString") sed -e "s$fancyDelim$oldStringFixed$fancyDelim$newString${fancyDelim}g" "$file" \ > newfile.updated mv newfile.updated "$file"