sed + 用键替换方括号中的字符串

sed + 用键替换方括号中的字符串

我想用 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.

相关内容