我正在尝试使用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
答案 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
的末尾跳过两行。