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


相关文章
|
Linux 数据库
【Openstack】排错:Glance服务安装后HTTP 500解决
在搭建Openstack平台时,装完各个组件后发现了glance无法正常使用
3264 0
【Openstack】排错:Glance服务安装后HTTP 500解决
|
监控 Linux
Linux系统监控报告CPU软锁定问题(soft lockup)诊断方法
以上方法结合起来使用将大大提高解决此类问题效率与成功率。实际操作过程需谨慎考虑当前环境与场景特点选择合适方法,并且要注意数据备份与恢复计划防止误操作造成不可挽回损失。
1554 13
|
Python
python简单分割文件的方法(python经典案例)
这篇文章介绍了两种使用Python进行文件分割的方法:通过读取指定字节数分割大文件成小文件,以及通过行数将文本文件分割成多个小文件。
1178 1
|
Prometheus 监控 Cloud Native
Prometheus 安全性与数据隐私
【8月更文第29天】Prometheus 是一个开源的监控系统,广泛应用于各种规模的企业中。随着 Prometheus 的普及,确保其安全性变得尤为重要。本文将详细探讨如何确保 Prometheus 服务器的安全性,包括认证、授权、加密通信等方面的措施,并提供相应的配置示例。
1157 2
|
12月前
|
JSON 运维 监控
拼多多:通过物流预警API提前识别异常订单,主动联系用户
拼多多集成物流预警API,实时监控订单状态,通过规则引擎识别延迟、丢失等异常,自动触发用户通知,提升满意度、降低售后压力。技术结合API调用、异常检测与自动化响应,实现主动式物流管理,助力构建高效、可信的电商体验。(238字)
1194 0
|
Shell Perl
用sed如果原字符串或新字符串中包含特殊字符(如正斜杠/或其他特殊字符),需要用\进行转义
用sed如果原字符串或新字符串中包含特殊字符(如正斜杠/或其他特殊字符),需要用\进行转义
2435 7
|
存储 消息中间件 弹性计算
统一观测丨借助 Prometheus 监控 ClickHouse 数据库
统一观测丨借助 Prometheus 监控 ClickHouse 数据库
2264 119
统一观测丨借助 Prometheus 监控 ClickHouse 数据库
|
存储 监控 固态存储
如何在 Linux 上检查 SSD/HDD 健康状况?
【10月更文挑战第14天】
2843 1
如何在 Linux 上检查 SSD/HDD 健康状况?

热门文章

最新文章