替换主机 URL(包括方括号)

替换主机 URL(包括方括号)

在 Ubuntu 18.04 中,我尝试使用以下命令替换一行,hosts: ["localhost:9200"]hosts:"http:xx.xx.xx:9200"它没有在目标文件中更新。

sed -i  's/hosts: ["localhost:9200"]/hosts:"http:xx.xx.xx:9200"/g' /home/test/beat.yaml

有什么问题?如何解决?

答案1

在正则表达式中[]包含一个字符集。[something]匹配集合somet、、中的任一字符hing

您的命令将替换例如hosts: 9因为9它在您(无意中)定义的集合中。

您想要匹配文字[]字符。为此,您至少需要转义[,尽管转义两者也没有错。您可以使用 转义字符\。试试这个:

sed 's/hosts: \["localhost:9200"]/hosts:"http:xx.xx.xx:9200"/g' /home/test/beat.yaml

注意我省略了-i。我猜你应该对 进行反混淆xx.xx.xx,检查输出是否正确,-i如果正确则添加。

如果您想要严格地“替换一行hosts: ["localhost:9200"]”,即仅当模式形成整行(而不是一行的一部分)时,则应使用与行首和行尾匹配的锚点。它们分别是^$g则不需要。

sed 's/^hosts: \["localhost:9200"]$/hosts:"http:xx.xx.xx:9200"/' /home/test/beat.yaml

请记住,在匹配的行中添加任何空格(或制表符,或其他任何内容)都会使行不匹配。空格可能是多余的,也可能是故意的(例如用于缩进)。问问自己是否真的需要这些锚点。

相关内容