如何用命令的输出替换字符串?

如何用命令的输出替换字符串?

假设我运行hostname -i并得到以下输出:

root@linux:/# hostname -i
192.168.1.1
root@linux:/#

我如何通过管道输出(仅 IP 地址)来替换给定文件中的特定字符串?

我想(即使用sedawk)将该命令的输出通过管道传送到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,

相关内容