Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 查找字符串并在某些字符之前添加字符串_Regex_Linux_Shell_Sed - Fatal编程技术网

Regex 查找字符串并在某些字符之前添加字符串

Regex 查找字符串并在某些字符之前添加字符串,regex,linux,shell,sed,Regex,Linux,Shell,Sed,我试图找到行,然后在其中添加一些字符串,但在一些字符之前。文件如下: { "rpc-port": 1234, "rpc-username": "", "rpc-whitelist": "123.4.5.2,123.123.123.123,152.125.125.125,12.45.12.45,12.36.45.78,12.69.6.1,12.4.8.95,12.45.45.45", "rpc-whitelist-enabled": true } 我希望在rpc白

我试图找到行,然后在其中添加一些字符串,但在一些字符之前。文件如下:

{
    "rpc-port": 1234,
    "rpc-username": "",
    "rpc-whitelist": "123.4.5.2,123.123.123.123,152.125.125.125,12.45.12.45,12.36.45.78,12.69.6.1,12.4.8.95,12.45.45.45",
    "rpc-whitelist-enabled": true
}
我希望在
rpc白名单
的行中添加2个ip。因此,最终结果将是:

{
    "rpc-port": 1234,
    "rpc-username": "",
    "rpc-whitelist": "123.4.5.2,123.123.123.123,152.125.125.125,12.45.12.45,12.36.45.78,12.69.6.1,12.4.8.95,12.45.45.45,123.123.123.123,123.123.123.123",
    "rpc-whitelist-enabled": true
}
IP是动态的,因此可能会发生变化

我尝试使用以下命令,但它将添加到行的末尾

sed -i '/^"rpc-whitelist"/ s/$/ 123.123.123.123,123.123.123.123/' settings.json
我还考虑删除最后两个字符并插入新字符串。

您可以使用

sed -i 's/^[[:blank:]]*"rpc-whitelist":[[:blank:]]*"[^"]*/& 123.123.123.123,123.123.123.123/' settings.json 

详细信息

  • ^
    -匹配行首
  • [[:blank:][]*
    -0+空格字符
  • “rpc白名单”:
    -文字子字符串
  • [[:blank:][]*
    -0+空格
  • -a
    字符
  • [^”]*
    -0+字符,而不是

替换模式中的
&
粘贴回匹配的文本,因此在替换操作中不会丢失它。

我建议使用适当的json解析器,例如使用
jq

jq --arg ip "123.123.123.123" '."rpc-whitelist" = ."rpc-whitelist" + "," + $ip' infile.json
输出:

{
“rpc端口”:1234,
“rpc用户名”:“”,
“rpc白名单”:“123.4.5.2123.123.123.123152.125.125.125,12.45.12.45,12.36.45.78,12.69.6.1,12.4.8.95,12.45.45.123.123.123”,
“已启用rpc白名单”:true
}

也许这个帮助是我想要添加的替代品string@executable
[:blank://code>是一个POSIX字符类,它与水平空格字符相匹配。它应该在括号表达式中使用,因此它是
[[:blank:][]
。实际上,您甚至可以使用
[[:space:]
(任何空格),因为
sed
是逐行工作的。如果较短的
\s
适合您,您可以使用
\s
(它匹配任何空格)。