解决脚本实现:sed -i 替换变量,变量中含有特殊转义字符的问题

简介: 解决脚本实现:sed -i 替换变量,变量中含有特殊转义字符的问题

写脚本时遇到的一个问题,在此分享一下


首先我利用awk命令取出某文件中的一个字段,并赋给了一个变量aaa,awk命令如下:

aaa=` awk '{if($0~"inst.stage2=hd")print}' ~/test`

此句我是以“inst.stage2=hd”为参考,在~/test文件中,找出匹配的字段


(awk命令不做详细解释,具体可以参考:https://www.runoob.com/linux/linux-comm-awk.html


awk命令运行后查找字段结果如下:


1.png


我直接利用sed -i ‘s/原字符/替换后字符/g’  命令对awk查找出来的字段进行修改,会出现错误


1.png


出现错误的原因是sed ‘s///g’ 中间填入的原字符和替换字符处,特殊字符必须转义,上图中的/dev/sda1 的两个“/”没有转义


正确语句应为

sed -i "s/inst.stage2=hd:LABEL=\/dev\/sda1/inst.stage2=hd:LABEL=KYLIN-BACKUP/g" ~/test  (1-1)

1.png


也就是\/dev\/sda1 , “\”为转义字符,是不同于目录的字符,要注意分清


上面的部分只是简单的用awk命令加上sed命令在命令行中进行简单的查找和替换,但如果我的awk查找命令,将结果赋给了一个变量aaa,如果直接使用做替换

sed -i "s/$aaa/inst.stage2=hd:LABEL=KYLIN-BACKUP/g" ~/test

结果不会报错,但是发现test文件并没有按要求进行修改,相关字段仍为【inst.stage2=hd:LABEL=/dev/sda1】


原因:


此时字段通过aaa变量获取,但仍存在字符转义问题,需要对aaa这个变量稍加修改,使sed 运行时得到的结果为带有转义字符,如语句(1-1)所示


解决:


我将变量aaa的内容赋给了第二个变量,取名为a,将里面的“/”都替换为“\/” ,代码如下

a=` echo $aaa | sed 's#\/#\\\/#g'`

解释一下 ,此处的sed 框架是用的  sed 's#原字符#替换后字符#g' ,此时以“#”作为分隔符,为了不与目录的分隔符起冲突,作用其实一样


1.png


这里一共六个\ / 这样的字符我们暂时称为【字符1-6】,下面分别解释一下都是什么意思 (手写数字难看,大家忽略~)


1、转义字符“\” (在回车的上面),是为了将【字符2】的 “ / ” 进行转义;


2、原本字符 “ / ”,表示目录的意思,是被【字符1】转义的字符,【字符1】与【字符2】组合在一起  “ \ / ” 放在sed的第一组# #内,对照【sed 's#原字符#替换后字符#g' 】,也就是匹配原句中的两个 “ / ”


1.png


3/4/5/6、 想要达到的效果是,替换后的字符变成 “ \ / ” ,但是这两个字符又都是特殊字符,需要转义,将 \ 转义后是 \\  ,将 / 转义后是\ / ,  所以连起来就是 \\\/


综上,最后将三个语句连起来,写入脚本

#!/bin/sh
aaa=` awk '{if($0~"inst.stage2=hd")print}' ~/test`
a=` echo $aaa | sed 's#\/#\\\/#g'`
sed -i "s/$a/inst.stage2=hd:LABEL=KYLIN-BACKUP/g" ~/test

第一行是awk取到对应字段


第二行是将取到内容中含有 “ / ” 的字符 都替换为“ \ / ”


第三行是将含有转义字符的变量a,替换成【inst.stage2=hd:LABEL=KYLIN-BACKUP】并写入~/test中(sed -i ,-i这个参数,不加就是不写入,但可以看结果,加 i 就是直接写入到原文件)


结果:


替换前文件内容:


1.png


执行脚本后文件内容:


1.png


END


相关文章
|
机器学习/深度学习 Java Shell
shell&变量替换
shell的变量替换
114 0
|
Ubuntu Linux Perl
如何使用 sed 替换文件中的字符串?
如何使用 sed 替换文件中的字符串?
226 0
|
弹性计算 Shell Linux
3天玩转shell--5.变量截取字符串
本文将通过shell代码示例,简单通俗的讲解shell。通过执行代码和运行结果反向掌握shell编程方法。准备一台低配的阿里云ECS Linux环境,跟着教程走起,本文比较适合shell小白。
133 0
|
Linux Perl
LINUX使用sed修改文件,如果包含变量,需要使用双引号
LINUX使用sed修改文件,如果包含变量,需要使用双引号
236 0
|
Shell
SHELL中变量字串中包含$时怎么办?
SHELL中变量字串中包含$时怎么办?
143 0
|
Shell
SHELL脚本递归循环,文件名包含空格的处理办法
SHELL脚本递归循环,文件名包含空格的处理办法
187 0
|
Shell
SHELL下去掉变量中的回车换行
SHELL下去掉变量中的回车换行
373 0
|
Shell
shell中for循环变量有空格的问题——IFS变量
shell中for循环变量有空格的问题——IFS变量
496 0
|
PHP Perl
sed 多行替换,多行模式处理字符串;一次替换
作者:凨 例: 需求:sed 替换多行(2到6行)替换为空,且返回系统配置信息 <?php /**CustomConfigurationStart*/ $c=require APP_PATH.'Common/Conf/config-custom.php'; /*COOKIES,SESSION域*/ $domain=preg_replace('/(.*\.|.*\/\/)?(
3432 0