如何使用sed在文件中确定行插入带有变量的字符串

Posted jasmine095

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用sed在文件中确定行插入带有变量的字符串相关的知识,希望对你有一定的参考价值。

背景

最近在研究一键部署,其中有一个环节,是要使用shell脚本放开防火墙的某个端口号

方法

使用shell中常见的插入文本命令:sed

问题

如果已经预知要打开的端口号如6379,可以使用:sed -i ‘10a\\-A INPUT -m state --state NEW -m tcp -p tcp --dport 6379 -j ACCEPT‘ /etc/sysconfig/iptables 来实现

但是目前的端口号为未知变量$port,如果使用:sed -i ‘10a\\-A INPUT -m state --state NEW -m tcp -p tcp --dport $port -j ACCEPT‘ /etc/sysconfig/iptables的植方式来写入,在iptables中仍然显示的是变量名,而不是变量名的值

这是一个大坑大坑

技术图片

 

找了很长时间的解决方法,比如加"",加\\。。。。,都没有用

终于在今天,一举突破,感谢给我提供思路和解决方案的陌生人,喝水不忘挖井人:http://www.capjsj.cn/sed_variable.html

解决方式为:sed -i ‘10i-A INPUT -m state --state NEW -m tcp -p tcp --dport ‘$port‘ -j ACCEPT‘ /etc/sysconfig/iptables

授人以鱼不如授人以渔,产生问题的原因是:

因为 $port 是shell变量而不是sed中的变量,需要单独拿到 sed 的单引号外面来才能被 shell 解析。单引号里面是 sed 的势力范围,shell 无法触及。

sed的参数后的命令,是以单引号开始,单引号结束的,所以想将shell变量拿出来,那就在变量前面加个单引号让sed命令结束,再在变量后面再加个单引号让sed命令再开始

以上是关于如何使用sed在文件中确定行插入带有变量的字符串的主要内容,如果未能解决你的问题,请参考以下文章

如何用sed命令替换一行中的某个字符串

使用 sed 在匹配后插入行

如何在 Windows 上使用 Sed 将特殊字符插入文本文件?

删除带有特定字符数的行

使用 sed 或 awk 在特定行号处插入一行

使用 sed 或 awk 在特定行号处插入一行