将值从一个命令的输出传递给sed

时间:2017-04-05 07:24:53

标签: bash sed

我有一个文件,config.txt有很多行。一行是这样的

address=

我正在使用

获取config.txt所在机器的IP地址
ip addr | grep 'state UP' -A2 | tail -1 | awk '{print $2}' | cut -f1  -d'/'

该代码取自Stack Overflow答案。我得到的输出是IP地址 -

192.168.3.260

我想替换

address= 
使用

在config.txt中

address='192.168.3.260'

是否可以在一行中进行,即

ip addr | grep 'state UP' -A2 | tail -1 | awk '{print $2}' | cut -f1  -d'/' | <some sed command >

2 个答案:

答案 0 :(得分:0)

在单个管道中使用awkawkgrep几乎总是一个错误,因为sed可以执行ip addr | sed -n '/state UP/ {n;n;s/ *inet \(.*\)\/.*/\1/p}' 所能做的所有事情,然后一些。您可以使用ip addr | sed -n "/state UP/ {n;n;s/ *inet \(.*\)\/.*/s|address=|\&'\1'|/p}" 单行提取IP地址,如下所示:

s|address=|&'192.168.3.260'|

您也可以使用此方法构建您正在寻找的命令:

sed

打印出类似这样的内容:

ip addr | sed -n "/state UP/ {n;n;s/ *inet \(.*\)\/.*/s|address=|\&'\1'|/p}" \
   | sed -f - config.txt

然后你可以将该程序传递给{{1}}:

{{1}}

答案 1 :(得分:-1)

sed -i 's/address=/address='$(ip addr | grep 'state UP' -A2 | tail -1 | awk '{print $2}' | cut -f1  -d'/')'/' filename

其中filename是相关文件的名称,这里的关键是使用间接即$(ip addr | grep'state UP'-A2 | tail -1 | awk'{print $ 2}'| cut -f1 -d'/')然后在sed命令中使用它,特别强调引号。间接必须位于sed命令的单引号之外。