如何使用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命令再开始

原文地址:https://www.cnblogs.com/jasmine095/p/11273374.html

时间: 2024-10-11 21:46:53

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

使用awk和sed获取文件奇偶数行的方法总结

测试文件test.file [root@localhost ~]# cat test.file 111111111111111 222222222222222 333333333333333 444444444444444 555555555555555 666666666666666 777777777777777 888888888888888 999999999999999 1010101010101010 1) 打印奇数行的方法 [root@localhost ~]# sed -n '1

Tools下的mdscongiguer 文件中 43行 oracle 配置 发现需要连接库 -lclntsh libclntsh.so 库是个什么东西呢?

Tools下的mdscongiguer     文件中 43行  oracle 配置      发现需要连接库 -lclntsh      libclntsh.so 库是个什么东西呢? 分想一个知乎网站上的帖子: -----------------------------------------------------------------------------------------------------------------------------------------------

vs报错“以下文件中的行尾不一致,是否将行尾标准化”

vs报错“以下文件中的行尾不一致,是否将行尾标准化” 分析: 通过读取源文件,发现换行都使用的是“\n”   Windows和Unix不同的标准引起的...即“回车”和“换行”的问题... 符号  ASCII码 意义 \n 10 换行NL \r 13 回车CR 在计算机还没有出现之前,有一种叫做电传打字机(Teletype Model 33)的玩意,每秒钟可以打10个字符.但是它有一个问题,就是打完一行换行的时候,要用去0.2秒,正好可以打两个字符.要是在这0.2秒里面,又有新的字符传过来,那么

python之从文件中按行读取数据

#!/usr/bin/env python3 # -*- coding: utf-8 -*- __author__ = 'jiangwenwen' # 从文件中按行读取数据 file = open("D:\坚果云\我的坚果云\\2019年计划.txt") while 1: lines = file.readlines(100000) if not lines: break for line in lines: print(line) 原文地址:https://www.cnblogs.c

在文件中读取、存储Json格式的字符串

public class Weather { static readonly string FilePath = System.Environment.CurrentDirectory + @"\Area.txt"; public static Models.Area GetCurrentArea() { var file = new FileInfo(FilePath); Models.Area result; if (!file.Exists) { //文件不存在就返回一个默认值,

Java如何从文件中打印与给定模式匹配的所有字符串?

在Java编程中,如何从文件中打印与给定模式匹配的所有字符串? 以下示例显示了如何使用Util.regex类的Patternname.matcher()方法从文件中打印与给定模式匹配的所有字符串. package com.yiibai; import java.util.regex.*; import java.io.*; public class PatternMatchingFromFile { public static void main(String[] args) throws IO

awk: 随机替换(使用文件中的行随机替换另一文件中的列)

#!/bin/awk -f #Function:指定使用文件中随机数量的行(手动传参ipl和idl)随机替换指定列(脚本中指定):使用指定位数的随机浮点替换指定列(脚本中指定). #Usage:./t.awk -v ip=<ip file> -v id=<id file> -v ipl=<n> -v idl=<n> log.txt #Date: 20140922 20:16 BEGIN {     srand()     #读取预用的ip列表     whi

用sed替换文件中的空格

请教sed 替换问题 请教各位如何替换多个空格为一个字符,如一个文件中间隔符有是一个空格,有的地方是多个空格,想全部用“|”替换,如何处理,请指教 请教sed 替换问题 [code]sed '/ \+/s//|/g'[/code] 请教sed 替换问题 来个awk的.awk '{for (i=1;i<nf;i++) printf="" $i"|";printf="" "\n"}'="" file<

vim打开文件中每行末尾都带有 ^M

为什么会出现^M? 1. 在windows下的文本文件的每一行结尾,都有一个回车('\n')和换行('\r') 2. 在linux下的文本文件的每一行结尾,只有一个回车('\n'); 3. 而在linux下打开windows编辑过的文件,就会在行末尾显示^M; 4. 注:^M在vim中为crtl+M 如何解决? 方法一 在vim命令行中输入 :%s/\r// %s/^M// #注意此处^M为crtl+M,不是字面上的^M 方法二 用dos2unix dos2unix filename 方法三 s