我需要替换清单中的文件的哈希值。我的问题是我不知道原始哈希,只知道新哈希。
mainfest :
[
{
"file": "bundle.js",
"hash": "0a4c61f0cf23ca1fd39c411140941cd5"
},
{
"file": "0fdbe5712e250dac1fa5930395f65a27.jpg",
"hash": "0fdbe5712e250dac1fa5930395f65a27"
}
]
如您所见,在清单(JSON)中,文件名和哈希被捆绑在一个对象中。
我想用新的更改bundle.js的哈希文件。我使用下面的shell脚本和sed和正则表达式来替换哈希。
shell脚本:
#!/bin/sh
NEW_HASH="$(md5 < ./scripts/bundle.js)"
sed 's/\({"file": "bundle.js","hash": "\).*\("}\)/\1'$NEW_HASH'\2/g' chcp.manifest
只有我不知道如何匹配多条线。我的正则表达式只匹配一行
{"file": "bundle.js","hash": "0a4c61f0cf23ca1fd39c411140941cd5"}
而不是
{
"file": "bundle.js",
"hash": "0a4c61f0cf23ca1fd39c411140941cd5"
}
我尝试过类似的事情:
sed 's/\({"file": "bundle.js",\n "hash": "\).*\("\n }\)/\1'$NEW_HASH'\2/g' chcp.manifest
但是\ n没有缝合来匹配新线
答案 0 :(得分:2)
尝试使用类似sed
或awk
之类的JSON(或XML等)来解析结构化格式非常棘手,并且从未像使用实际设计用于解析数据的工具一样强大#39;重新工作。
使用Python或Ruby或Perl或使用JSON解析器的其他东西,您的任务将相对简单。对于shell脚本,您可能需要调查jq命令,该命令可用作大多数发行版的包。
使用jq
,您可以使用this document中描述的技术,该技术将归结为:
NEW_HASH="$(md5 < ./scripts/bundle.js)"
jq 'map(if .file == "bundle.json"
then . + {"hash": "'"$NEW_HASH"'"}
else .
end)' chcp.manifest
这将在 stdout 上生成新文档;您显然可以将其保存到文件中,然后重命名以替换原始文件。