使用sed替换shell脚本中的特殊字符 [英] Replacing special characters in a shell script using sed

查看:35
本文介绍了使用sed替换shell脚本中的特殊字符的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试编写一个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,脚本运行得更好了。但是,我仍然在用空格(即‘*’)替换单引号字符时遇到问题。新版本高于此版本。

推荐答案

我建议两点改进:

  1. 不要像您那样将调用堆叠到sed,而是将所有调用打包到单个函数中,如下所示escape_string

  2. 您可以对sed替身命令使用别致的分隔符,以避免与/作为所涉及字符串的一部分相关的问题。

进行这些更改后,您的脚本如下所示:

#! /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"

这篇关于使用sed替换shell脚本中的特殊字符的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆