在 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]
匹配集合s
、o
、m
、e
、t
、、中的任一字符h
。i
n
g
您的命令将替换例如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
请记住,在匹配的行中添加任何空格(或制表符,或其他任何内容)都会使行不匹配。空格可能是多余的,也可能是故意的(例如用于缩进)。问问自己是否真的需要这些锚点。