Shell sed替换文件中第n个位置的子网列表
向每个ip地址添加“ip”、“ip”、“ip”Shell sed替换文件中第n个位置的子网列表,shell,sed,Shell,Sed,向每个ip地址添加“ip”、“ip”、“ip” tf_alist=$(for i in $alist; do echo -n "\"$i\"",; done | sed 's/,$//') echo $tf_alist 给出: "192.168.0.216/29","192.168.92.72/30","192.168.92.70/31" ["192.168.241.88/32&qu
tf_alist=$(for i in $alist; do echo -n "\"$i\"",; done | sed 's/,$//')
echo $tf_alist
给出:
"192.168.0.216/29","192.168.92.72/30","192.168.92.70/31"
["192.168.241.88/32", "192.168.128.222/32", "192.168.231.150/32"]
现在,我有了variable.tf
,如下所示:
variable "allowlisted_cidrs_prod" {
type = list(string)
description = "ip ranges - allowlisted - prod instances"
default = ["192.168.241.88/32", "192.168.128.222/32", "192.168.231.150/32"]
}
variable "allowlisted_cidrs_test" {
type = list(string)
description = "ip ranges - allowlisted - test instances"
default = ["192.168.58.61/32", "192.168.3.224/32"]
}
variable "elb_cipher" {
type = string
description = "ELB cipher"
default = "ELBSecurityPolicy-TLS-1-2-2017-01"
}
在变量“allowlisted\u cidrs\u prod”
中,我想替换以下列表字符串:
- 发件人:
default=[“192.168.241.88/32”、“192.168.128.222/32”、“192.168.231.150/32”]
- 发送至(根据
):$tf_alist
default=[“192.168.0.216/29”、“192.168.92.72/30”、“192.168.92.70/31”]
old_ip_list=$(cat variable.tf | sed -n '/variable "allowlisted_cidrs_prod"/,$ {/^[[:blank:]]*default[[:blank:]]*=[[:blank:]]*\(.*\).*/ { s//\1/p; q; }}')
给出:
"192.168.0.216/29","192.168.92.72/30","192.168.92.70/31"
["192.168.241.88/32", "192.168.128.222/32", "192.168.231.150/32"]
参考:
从给定输出中删除“[]”以与$tf\u alist
匹配
echo -e "\n $old_ip_list" | gsed 's/.*\[//;s/\].*//;'
编辑这样的结构化格式的最佳方法是为特定的结构化格式使用工具。如果这是编程语言中的代码,可能需要更改代码以将外部资源中的值读取到变量中,如果可以避免的话,根本不要修改代码 话虽如此,这里是一个快速重构
tf_alist=$(printf',%s'$alist | sed's/^,/'))
awk-v new=“$tf_alist””/^variable/{v=$2}
v=“\”允许的“产品”&&&$1==“默认”{sub(/\[.*/,“[”新“])}”
1'variable.tf>新建_variable.tf
这只是跟踪它最后看到的变量
,并且只在我们试图瞄准的行时替换默认
行。final1
是一种常见的Awk习惯用法,可以无条件打印所有行。当然sub
是Awk在seds///code>命令的等价物ode>,而“[“new”]”
是简单的字符串连接;我们在变量new
的值周围放了方括号(它在-v
选项中定义-它包含shell变量$tf_list
的值)
与所有的特殊解析器一样,这是相当脆弱的,但它与您提供的示例(演示:)一起工作。如果这不是一次性的,请认真考虑另一种方法,而不是花费更多时间使其更健壮(或者,在只读sed
中重新实现它).oh wow!这是我的下一个级别。非常感谢!我正在测试sed-I's/$old\u ip\u list/$tf\u alist/g“
,但您的解决方案看起来要好得多!请您也解释一下awk脚本是如何工作的?添加了一个简短的解释。如果您对awk完全不熟悉,请将其视为sed
++--基本处理模型非常相似。我正在尝试了解new
(在sub的上下文中)(regexp、替换、目标)
)有效。请您详细说明或给我指一些文档好吗?new
只是我在-v
选项中定义的变量的名称;该值是从shell变量tf_list
复制的。我专门使用了不同的变量名称来强调这两个变量是分开的;Awk不知道您的shell的名称变量,反之亦然。