解决脚本实现: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


相关文章
|
7月前
|
机器学习/深度学习 Shell Windows
shell学习(八) 【shell 正则 匹配符和限定符】
shell学习(八) 【shell 正则 匹配符和限定符】
46 1
|
Shell 索引
shell脚本变量详解(自定义变量、环境变量、变量赋值、变量运算、变量内容替换)
shell变量 shell变量是指用一个特定的字符串去表示不固定的内容 1.变量的类型 1.1自定义变量 一般情况下不怎么使用环境变量,如果需要在其他文件中引入某个文件的变量则在脚本最开始的位置使用source 或者. 执行下该脚本即可
2840 0
shell脚本变量详解(自定义变量、环境变量、变量赋值、变量运算、变量内容替换)
|
Ubuntu Linux Perl
如何使用 sed 替换文件中的字符串?
如何使用 sed 替换文件中的字符串?
220 0
|
Shell
【Shell编程】Shell中Bash变量-数值运算、运算符变量、测试和内容替换
【Shell编程】Shell中Bash变量-数值运算、运算符变量、测试和内容替换
91 0
|
弹性计算 Shell Linux
3天玩转shell--5.变量截取字符串
本文将通过shell代码示例,简单通俗的讲解shell。通过执行代码和运行结果反向掌握shell编程方法。准备一台低配的阿里云ECS Linux环境,跟着教程走起,本文比较适合shell小白。
133 0
|
Linux Perl
LINUX使用sed修改文件,如果包含变量,需要使用双引号
LINUX使用sed修改文件,如果包含变量,需要使用双引号
227 0
|
Shell
SHELL中变量字串中包含$时怎么办?
SHELL中变量字串中包含$时怎么办?
141 0
|
Shell
shell中for循环变量有空格的问题——IFS变量
shell中for循环变量有空格的问题——IFS变量
490 0
|
PHP Perl
sed 多行替换,多行模式处理字符串;一次替换
作者:凨 例: 需求:sed 替换多行(2到6行)替换为空,且返回系统配置信息 <?php /**CustomConfigurationStart*/ $c=require APP_PATH.'Common/Conf/config-custom.php'; /*COOKIES,SESSION域*/ $domain=preg_replace('/(.*\.|.*\/\/)?(
3429 0
脚本变量中包含空格的解决办法
脚本变量中包含空格的解决办法
204 0