文件中的原始行:
alarm_name = "${var.environment}-${var.deployment}-${var.service_name}-elb-healthyhosts"
想要这条线没有${}
, ${}
, ${}
:
alarm_name = "var.environment-var.deployment-var.service_name-elb-healthyhosts"
这样sed
:它删除了第一个${
和最后一个}
:
sed s'/\${\(.*\)}/\1/' filename
如何成对地删除大括号?
答案1
我会用
sed -E 's/\$\{([^}]+)\}/\1/g'
演示:
$ line='alarm_name = "${var.environment}-${var.deployment}-${var.service_name}-elb-healthyhosts"'
$ sed -E 's/\$\{([^}]+)\}/\1/g' <<<"$line"
alarm_name = "var.environment-var.deployment-var.service_name-elb-healthyhosts"
答案2
有了这个输入,您所需要的就是:
$ tr -d '${}' < file
alarm_name = "var.environment-var.deployment-var.service_name-elb-healthyhosts"
如果这不是您所需要的全部,那么编辑您的问题以提供更具代表性的示例输入/输出,但这是行不通的。
答案3
你的问题是它也匹配初始和最终之间的.*
中间值。${}
${
}
您可以使用s/${\([^}]*\)}/\1/g
它,这几乎是您所拥有的,只不过.*
被替换为[^}]*
,它匹配零个或多个非}
字符。最后/g
重复所有非重叠匹配的替换。
然而,这不适用于嵌套的东西,比如${...${...}...}
,如果你有的话。
另一种方法:
从该行中删除所有${
和 the :}
sed -e 's/${//g' -e 's/}//g' file
上述命令的好处是两个简单的正则表达式通常比一个更复杂的表达式更容易理解和维护。它还处理嵌套${}
字符串,但缺乏处理嵌套字符串的能力配对 ${
with }
,所以它会删除任何一个${
or}
无论是否有对应的}
or${
就行了。
如果您只想在以字符串开头的行上执行此操作alarm_name =
:
sed -e '/^alarm_name =/!b' -e 's/${//g' -e 's/}//g' file
该b
命令分支到脚本末尾,如果该行不匹配,我们在这里使用它来绕过替换^alarm_name =
。
测试:
$ cat file
alarm_name1 = "${var.environment}-${var.deployment}-${var.service_name}-elb-healthyhosts"
alarm_name = "${var.environment}-${var.deployment}-${var.service_name}-elb-healthyhosts"
alarm_name2 = "${var.environment}-${var.deployment}-${var.service_name}-elb-healthyhosts"
$ sed -e '/^alarm_name =/!b' -e 's/${//g' -e 's/}//g' file
alarm_name1 = "${var.environment}-${var.deployment}-${var.service_name}-elb-healthyhosts"
alarm_name = "var.environment-var.deployment-var.service_name-elb-healthyhosts"
alarm_name2 = "${var.environment}-${var.deployment}-${var.service_name}-elb-healthyhosts"
既然你用标签标记了你的问题编辑,这就是您在编辑器中执行此操作的方法ed
:
g/^alarm_name =/ s/${//g\
s/}//g
也就是说,对于所有匹配的行^alarm_name =
执行两次替换。
或者,作为来自命令行的脚本作业:
printf '%s\n' 'g/^alarm_name =/ s/${//g\' 's/}//g' ',p' 'Q' |
ed -s file
接下来,p
将Q
在退出之前将修改后的文件的内容输出到标准输出。使用w
和q
(或wq
)将更改写回文件。