![如何用命令的输出替换字符串?](https://linux22.com/image/196262/%E5%A6%82%E4%BD%95%E7%94%A8%E5%91%BD%E4%BB%A4%E7%9A%84%E8%BE%93%E5%87%BA%E6%9B%BF%E6%8D%A2%E5%AD%97%E7%AC%A6%E4%B8%B2%EF%BC%9F.png)
假设我运行hostname -i
并得到以下输出:
root@linux:/# hostname -i
192.168.1.1
root@linux:/#
我如何通过管道输出(仅 IP 地址)来替换给定文件中的特定字符串?
我想(即使用sed
或awk
)将该命令的输出通过管道传送到my_server_ip
以下部分:
"server":"my_server_ip",
"server_port":8388,
答案1
我猜你只是想要更改后引号中的内容"server"
,而不是特定的 string my_server_ip
,如果是这样,则使用任何 sed:
$ sed 's/\("server":"\)[^"]*/\1'"$(hostname -i)"'/' file
"server":"<the host name>",
"server_port":8388,
或任何 awk (如果 的输出hostname -i
可以包含反向引用元字符或 sed 分隔符,则更健壮,但它不应该包含):
$ awk -v h="$(hostname -i)" 'BEGIN{FS=OFS="\""} $2=="server"{$4=h} 1' file
"server":"<the host name>",
"server_port":8388,
答案2
您可以使用替换参数,例如:sed -i -e "s/my_server_ip/$(hostname -i)/" txt
答案3
如果您使用的是 GNU sed,那么您可以/e
在命令中使用该标志s/
,但执行的命令是整行:
#!/bin/sed -f
/my_server_ip/{
s//%s/
s/.*/printf '&' $(hostname -i)/e
}
这将创建一个看起来像的命令行printf '"server":"%s",' $(hostname -i)
,然后执行它,替换相关行。
答案4
m=$(hostname -i)
sed -i "s/my_server_ip/$m/g" filename
"server":"192.168.1.1",
"server_port":8388,