多行正则表达式shell脚本

时间:2017-03-28 17:58:23

标签: regex shell

我需要替换清单中的文件的哈希值。我的问题是我不知道原始哈希,只知道新哈希。

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没有缝合来匹配新线

1 个答案:

答案 0 :(得分:2)

尝试使用类似sedawk之类的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 上生成新文档;您显然可以将其保存到文件中,然后重命名以替换原始文件。