如何解决sed替换文件列表中第n个位置的子网列表
在每个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"
现在,我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"
}
在variable "allowlisted_cidrs_prod"
,我想替换下面的列表字符串:
-
发件人:
default = ["192.168.241.88/32","192.168.231.150/32"]
-
收件人(根据
$tf_alist
):default = ["192.168.0.216/29","192.168.92.70/31"]
您能建议一种使用sed的方法吗? TYA!
要替换字符串,我尝试使用以下表达式捕获现有的IP列表:
old_ip_list=$(cat variable.tf | sed -n '/variable "allowlisted_cidrs_prod"/,$ {/^[[:blank:]]*default[[:blank:]]*=[[:blank:]]*\(.*\).*/ { s//\1/p; q; }}')
给予:
["192.168.241.88/32","192.168.231.150/32"]
参考:https://sed.js.org/?gist=bdeddb0ed01bdc8f96b3a05952909cd7
从给定输出中删除“ []”以与$tf_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=="\"allowlisted_cidrs_prod\"" && $1 == "default" { sub(/\[.*/,"[" new "]") }
1' variable.tf >new_variable.tf
这只是跟踪最后一次看到的variable
,并且仅在我们尝试定位的default
行时替换它。最后的1
是常见的Awk习惯用法,可无条件地打印所有行。当然,sub
与s///
中的sed
命令等效,而"[" new "]"
是简单的字符串连接;我们在变量new
(在-v
选项中定义-包含外壳变量$tf_alist
的值)的值两边加上方括号。
与所有临时解析器一样,这非常脆弱,但是可以与您提供的示例一起使用(示例:https://ideone.com/7kDNCU)。如果这不仅仅是一次性的,请认真考虑采用另一种方法,而不是花费更多的时间使此方法更可靠(或者,天哪,以只读sed
重新实现)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。