我想用 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
答案1
首先,您必须确保您的key
变量不包含任何对您的sed
命令具有特殊含义的字符,例如/
sed 替换的默认分隔字符。在这种情况下,您可以使用不同的字符,例如这样"s@pattern@replacement@g" file
。
然后你需要从一个左括号开始匹配到相应的右括号。那是,\[.*\]
但 sed 是贪婪的:如果您的行包含[text1] text2 [text3]
,sed 将匹配所有这些。因此,您需要定义.*
任何不是右括号的字符,而不是 ,零次或多次:[^]]*
。
请注意,在上面,我们不需要对\]
中间的括号进行转义( ),因为sed
在插入符号( )之后等待至少一个字符排除^
,因此不会将其误读为列表的右括号排除的字符,但作为文字括号。
现在,如果您想就地进行更改,您可以使用-i
如下描述的方法邮政。但首先要在没有 的情况下进行测试-i
,检查输出的一部分,看看它是否看起来不错。
因此,这sed
预计适用于您的情况:
sed -i "s/\[[^]]*\]/$key/g" file
答案2
您的正则表达式在“*”之前缺少“。”。如果您确定只有一个左括号和一个右括号,那么这应该有效:
sed "s/\[.*\]/$key/g" /tmp/file
这会打印到标准输出,如果您想就地编辑,请使用sed -i
.