【发布时间】:2019-07-05 19:03:51
【问题描述】:
Linux RH 5.11
GNU sed 4.1.5 版
我有以下文件,我想在 KEY 值以 ABC+ 的值替换为另一个(版本)值/em>、DEF 或 XYZ 通过运行一个命令(使用 sed 组词进行基于自动换行/正则表达式的匹配时的能力。
linux_user@linux_server123 [ ~ ] 18:37:18 :9152> cp ~/my-file.json ~/BKUP-my-file.json; cat ~/my-file.json
{
"versions": {
"ABC_PROJECT_Product": "+",
"IGNORE1_PROJECT_Product": "1.8.0.1371",
"DEF_PROJECT_Product": "+",
"XYZ_PROJECT_Product": "+",
"IGNORE2_PROJECT_Product": "1.1.0.830",
"ABC_PROJECTGlobal": "+",
"DEF_PROJECTGlobal": "+",
"IGNORE2_PROJECTGlobal": "1.1.0.830",
"ABC_PROJECTGlobalSSD": "+",
"DEF_PROJECTGlobalSSD": "+",
"ABC_PROJECT_ProductSSD": "+",
"IGNORE3_PROJECT_ProductSSD": "1.0.0.4913",
"DEF_PROJECT_ProductSSD": "+",
"ABC_PROJECTLocalREBS": "+",
"IGNORE4_PROJECTLocalREBS": "1.1.0.865",
"ABC_PROJECT_ProductODNS": "+",
"IGNORE3_PROJECT_ProductODNS": "1.0.0.4913",
"DEF_PROJECT_ProductODNS": "+",
"ABC_PROJECT_ProductIDNS": "+",
"DEF_PROJECT_ProductIDNS": "+",
"IGNORE2_PROJECT_ProductIDNSS": "1.1.0.830",
"ABC_PROJECTGlobalIDNS": "+",
"DEF_PROJECTGlobalIDNS": "+",
"ABC_PROJECTGlobalODNS": "+",
"DEF_PROJECTGlobalODNS": "+",
"ABC_PROJECTLocalSpecial": "+",
"IGNORE4_PROJECTLocalSpecial": "1.1.0.865",
"ABC_PROJECT_ProductSpecial": "+",
"IGNORE5_PROJECT_ProductSpecial": "2.1.0.683",
"DEF_PROJECT_ProductSpecial": "+",
"ABC_PROJECTGlobalSpecial": "+"
}
}
.
cp ~/BKUP-my-file.json ~/my-file.json;
sed_regex="\(ABC\|DEF\|XYZ\)";
sed -i "s/\(.*\"${sed_regex}_PROJECT.*\".*:.*\"\).*\(\".*\)/\11.22.333.4444\2/" ~/my-file.json;
sed -n "/.*\(ABC\|DEF\|XYZ\)_PROJECT.*/p" ~/my-file.json
"ABC_PROJECT_Product": "1.22.333.4444ABC
"DEF_PROJECT_Product": "1.22.333.4444DEF
"XYZ_PROJECT_Product": "1.22.333.4444XYZ
"ABC_PROJECTGlobal": "1.22.333.4444ABC
"DEF_PROJECTGlobal": "1.22.333.4444DEF
"ABC_PROJECTGlobalSSD": "1.22.333.4444ABC
"DEF_PROJECTGlobalSSD": "1.22.333.4444DEF
"ABC_PROJECT_ProductSSD": "1.22.333.4444ABC
"DEF_PROJECT_ProductSSD": "1.22.333.4444DEF
"ABC_PROJECTLocalREBS": "1.22.333.4444ABC
"ABC_PROJECT_ProductODNS": "1.22.333.4444ABC
"DEF_PROJECT_ProductODNS": "1.22.333.4444DEF
"ABC_PROJECT_ProductIDNS": "1.22.333.4444ABC
"DEF_PROJECT_ProductIDNS": "1.22.333.4444DEF
"ABC_PROJECTGlobalIDNS": "1.22.333.4444ABC
"DEF_PROJECTGlobalIDNS": "1.22.333.4444DEF
"ABC_PROJECTGlobalODNS": "1.22.333.4444ABC
"DEF_PROJECTGlobalODNS": "1.22.333.4444DEF
"ABC_PROJECTLocalSpecial": "1.22.333.4444ABC
"ABC_PROJECT_ProductSpecial": "1.22.333.4444ABC
"DEF_PROJECT_ProductSpecial": "1.22.333.4444DEF
"ABC_PROJECTGlobalSpecial": "1.22.333.4444ABC
问题 1:
为什么sed 将ABC 或DEF 或XYZ 代替实际的\2 值,我理解它应该是:", 或只是:" 即行输入该行中的 JSON 对象(带/不带任何空格/制表符)?
问题 2:
我怎样才能得到"ABC_PROJECT_Product": "+", 值:
"ABC_PROJECT_Product": "1.22.333.4444",
问题 3:
为什么要使用这个sed 解决问题 1 和 2(除了让它更快)。
sed -i "/.*\"${sed_regex}_PROJECT.*\"/ s/\(.*\".*\".*:.*\"\).*\(\".*\)/\11.22.333.4444\2/" ~/my-file.json;
可能是awk 可以轻松做到这一点?
【问题讨论】:
-
1.22.333.4444是从哪里来的? -
现在看.. 错字忘记包括了。
-
不要使用 shell 实用程序操作
json。使用带有json验证的工具,例如jq。 -
你可以安装/使用
jq工具吗? -
什么?不批准
jq,然后让开发人员松手,试图用shell工具破解json(从而创造一个无意中制造更严重漏洞的机会),听起来就像是在倒退思考:)