Shell sed替换文件中第n个位置的子网列表

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

向每个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", "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”]

你能建议一种使用sed的方法吗?太好了

要替换字符串,我尝试使用以下表达式捕获现有IP列表:

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
这只是跟踪它最后看到的
变量
,并且只在我们试图瞄准的
行时替换
默认
行。final
1
是一种常见的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的名称变量,反之亦然。