我想用 sed 用目标替换 [....] 中的内容 key=new_string
more /tmp/file
my.uri=http://[linux123]:8080
我们试试这个
key=new_string
sed s"/\[*\]/$key/g" /tmp/file
但文件没有改变
more file
my.uri=http://[linux123]:8080
我的 sed 有什么问题?
预期结果应该是(没有方括号)
more file
my.uri=http://new_string:8080
首先,您必须确保您的key
变量不包含任何对您的sed
命令具有特殊意义的字符,例如/
这是 sed 替换的默认分隔字符。在这种情况下,您可以使用不同的字符,例如像这样"s@pattern@replacement@g" file
。
然后你需要从一个开始匹配到相应的结束括号。那将是\[.*\]
但 sed 贪婪:如果您的行包含[text1] text2 [text3]
, sed 将匹配所有这些。所以你需要定义,而不是.*
,任何不是右括号的字符,零次或多次:[^]]*
。
注意在上面,我们不需要\]
对中间的括号进行转义(),因为sed
在插入符号(^
)之后等待至少一个字符排除,所以它不会误认为这是列表的结束括号排除的字符,但作为文字括号。
现在,如果您想就地进行更改,则可以使用本文中-i
所述的方法。但是先不测试-i
,检查输出的一部分,看看它是否看起来不错。
因此,这sed
预计适用于您的情况:
sed -i "s/\[[^]]*\]/$key/g" file
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句