sed - 尝试在比赛后替换第一次出现

时间:2013-10-26 21:40:06

标签: regex windows batch-file sed

我正面临着让我疯狂的局面。 我正在设置一个使用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 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

正如sputnick指出,解析有点超出了sed的意图。尽管如此,sed的图灵完成并将其打成了你想做的事情,可以满足我们许多人不时感受到的那种悲伤,麻烦的冲动。

这个很容易。

sed '
   s/"sha1": /\n/g
   s/\("name": "plugin_name_foo_bar"[^\n]*\n"\)[^"]*/\1thenewsha/
   s/\n/"sha1": /g
'

答案 2 :(得分:0)

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

sed -i -r "s/(plugin_name_foo_bar.+?sha1\": \")[^\"]+\"/\1abcdefghijkl\"/" default.json

答案 3 :(得分:0)

sed -r "s/(plugin_name_foo_bar[^!]+sha1.: .)[^\"]+/\1abcdefghijkl/" file