1

我正面临一个让我发疯的情况。我正在设置一个使用 json 文件的更新服务器。不要问为什么或如何,这很糟糕,是我实现它的唯一可能性。

我一直在尝试和研究 HOURS(很多),因为我发疯了,想自己破解这个问题。但我必须意识到我被卡住了,需要帮助。

很抱歉这一块,但我认为看到它有点重要......

该文件是一个单行文件,并重复以下序列并更改值(当然)。

"plugin_name_foo_bar": {"buildDate": "bla", "dependencies": [{"name": "bla", "optional": true, "version": "1.00"}], "developers": [{"developerId": "bla", "email": "bla@gmail.com", "name": "Bla bla2nd"}], "excerpt": "some text {excerpt} !bla.png|thumbnail,border=1! ", "gav": "bla", "labels": ["report", "scm-related"], "name": "plugin_name_foo_bar", "previousTimestamp": "bla", "previousVersion": "1.0", "releaseTimestamp": "bla", "requiredCore": "1", "scm": "github.com", "sha1": "ynnBM2jWo25ZLDdP3ybBOnV/Pio=", "title": "bla", "url": "http://bla.org", "version": "1.0", "wiki": "https://bla.org"}, "Exclusion": {"buildDate": "bla", "dependencies": [],

然后下一个插件块直接粘合。我现在要做的是搜索,"plugin_foo_bar": {"因为这是新插件描述块的唯一标识符。我想替换之后出现的第一个 sha1 值。这就是我一直失败的地方。我总是抓住整个文件中的第一个、最后一个或任何出现的地方,而不是块:( "title"是 sha1 值之后的唯一标识符。

所以我试图让 .* 不那么贪婪,但它没有成功。

最后一次尝试是朝着: sed -i 's/("name": "plugin_name_foo_bar.*sha1": ")([a-zA-Z0-9!@#\$%^&*()\[\]]*)(", "title"\)/\1blablabla\2/1'default.json

找到该插件的 sha1 值,但仍然没有乐趣。我希望有人知道——最好是更简单的方法——在我现在继续试错之前,直到我不得不呕吐和发疯。

我正在 Windows 上使用 SED,因此 Unix 方法可能会帮助我弄清楚如何批量实现这一目标,但如果可能的话,请将其设为单行。转换脚本真的很痛苦。

而且我只需要 SED 而不需要其他工具(如 AWK)的其他解决方案。这绝对不在讨论范围内。

任何帮助表示赞赏:)

干杯一月

4

4 回答 4

1

不要使用正则表达式(sed)来解析 JSON,而是使用适当的 JSON 解析器,或者像我一样直接使用 javascript:

在脚本中使用

文件/tmp/file.json是:

{
   "plugin_name_foo_bar" : {
      "excerpt" : "some text {excerpt} !bla.png|thumbnail,border=1! ",
      "dependencies" : [
         {
            "name" : "bla",
            "version" : "1.00",
            "optional" : true
         }
      ],
      "title" : "bla",
      "previousTimestamp" : "bla",
      "releaseTimestamp" : "bla",
      "sha1" : "ynnBM2jWo25ZLDdP3ybBOnV/Pio=",
      "labels" : [
         "report",
         "scm-related"
      ],
      "buildDate" : "bla",
      "version" : "1.0",
      "previousVersion" : "1.0",
      "name" : "plugin_name_foo_bar",
      "scm" : "github.com",
      "url" : "http://bla.org",
      "gav" : "bla",
      "developers" : [
         {
            "email" : "bla@gmail.com",
            "developerId" : "bla",
            "name" : "Bla bla2nd"
         }
      ],
      "wiki" : "https://bla.org",
      "requiredCore" : "1"
   },
   "Exclusion" : {
      "dependencies" : [],
      "buildDate" : "bla"
   }
}

脚本script.js

var js = require('/tmp/file.json')

js.plugin_name_foo_bar.sha1 = "xxx"
console.log(js)

用法 :

nodejs script.js
于 2013-10-26T21:51:23.353 回答
0

正如 sputnick 指出的那样,解析有点超出 sed 的含义。尽管如此,sed 的图灵完备性并将其强加于你想要做的事情可以满足我们很多人不时感受到的{悲伤,受虐}主义冲动。

这甚至很容易。

sed '
   s/"sha1": /\n/g
   s/\("name": "plugin_name_foo_bar"[^\n]*\n"\)[^"]*/\1thenewsha/
   s/\n/"sha1": /g
'
于 2013-10-26T22:47:18.183 回答
0
sed -r "s/(plugin_name_foo_bar[^!]+sha1.: .)[^\"]+/\1abcdefghijkl/" file
于 2013-10-27T10:55:03.403 回答
0

对于 windows 命令行,带有转义引号,替换内联并使用正则表达式

sed -i -r "s/(plugin_name_foo_bar.+?sha1\": \")[^\"]+\"/\1abcdefghijkl\"/" default.json
于 2013-10-27T09:56:38.410 回答