在sed命令中使用变量

时间:2018-09-07 16:59:16

标签: linux sed

我正在尝试使用sed命令替换文件中的特定字符串。但是,它不起作用。我文件中的数据结构:

"SomeServerName": {
    "serverIP": "192.168.0.132",
    "serverPort": "9999",
    "active": false
}

在这种情况下,我想基于IP(我从终端获得的可变输入)将active的状态从 false 更改为 true

我使用的sed命令是:

sudo sed -i "s/$someIP/!b;n;n;c\ \ \ \ \ \ \ \ "active": true/" filename

在这里$someIP=192.168.0.132。在sed中,如果我将$ someIP替换为“ 192.168.0.132”,则可以正常工作。但是,如果我传递变量,它将无法正常工作。

编辑:以下是上述sed的整个脚本:

#! /bin/sh

someIP=$(hostname -I)
sudo sed -i "s/$someIP/!b;n;n;c\ \ \ \ \ \ \ \ "active": true/" filename

2 个答案:

答案 0 :(得分:1)

怎么样

sed -zE "s/($someIP[^\n]*\n[^\n]*\n[^\n]*\"active\": )false/\1true/g" filename

您不能从字面上“传递”变量来sed。 bash在开始sed之前,将参数中的$ someIP替换为其所引用的字符串,即它是按值传递。

请注意,尽管$ someIP不仅与192.168.0.132匹配,还与192:168:0:132或1924168903132匹配,因为sed为'。如果您不逃避的话,则表示“任何字符”。

只要匹配的IP和“活动”设置恰好有两行,否则它们之间未指定的内容,此命令将起作用。

答案 1 :(得分:1)

这是一个sed解决方案。请注意,您需要对""使用双引号sed,并在搜索或替换字符串中转义其他任何双引号。

 $ input_ip="192.168.0.132"
 $ sed -i "/$input_ip/{n;n;s/\"active\": false/\"active\": true/}" inputFile

这假设active: false字符串出现在$input_ip之后两行。 n;n;$input_ip的末尾跳过两行。