加入收藏 | 设为首页 | 会员中心 | 我要投稿 武汉站长网 (https://www.027zz.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 服务器 > 搭建环境 > Linux > 正文

使用sed替换shell脚本中的特殊字符

发布时间:2021-01-01 21:10:55 所属栏目:Linux 来源:网络整理
导读:我正在尝试编写一个 shell脚本,它将替换我使用sed选择的任何字符/字符串.我的第一次尝试使用特殊字符除外.我一直在尝试使用sed修复特殊字符,以便搜索或替换它们.我决定简化用于测试目的的脚本,并且只处理一个违规角色.但是,我仍然遇到问题. 编辑脚本 #! /b

我正在尝试编写一个 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 '01')

oldStringFixed=$(escape_string "$oldString")
sed -e "s$fancyDelim$oldStringFixed$fancyDelim$newString${fancyDelim}g" "$file" 
  > newfile.updated
mv newfile.updated "$file"

(编辑:武汉站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读