使用sed替换shell脚本中的特殊字符 [英] Replacing special characters in a shell script using sed
本文介绍了使用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,脚本运行得更好了。但是,我仍然在用空格(即‘*’)替换单引号字符时遇到问题。新版本高于此版本。
推荐答案
我建议两点改进:
不要像您那样将调用堆叠到
sed
,而是将所有调用打包到单个函数中,如下所示escape_string
。您可以对
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屋!
查看全文