Regex sed-尝试替换匹配后的第一个匹配项

Regex sed-尝试替换匹配后的第一个匹配项,regex,windows,batch-file,sed,javascript,nodejs,Regex,Windows,Batch File,Sed,Javascript,Nodejs,我正面临一个让我发疯的局面。 我正在设置一个使用json文件的更新服务器。 不要问为什么或如何,这很糟糕,是我实现它的唯一可能 我已经尝试和研究了几个小时(很多),因为我发疯了,想自己解决这个问题。但我必须意识到我陷入困境,需要帮助 很抱歉,这一块,但我认为有点重要的是看到 该文件是一个单行程序,并通过更改值重复以下顺序(当然) “plugin_name_foo_bar”:{“buildDate”:“bla”,“dependencies”:[{“name”:“bla”,“optional”:tr

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

我已经尝试和研究了几个小时(很多),因为我发疯了,想自己解决这个问题。但我必须意识到我陷入困境,需要帮助

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

该文件是一个单行程序,并通过更改值重复以下顺序(当然)

“plugin_name_foo_bar”:{“buildDate”:“bla”,“dependencies”:[{“name”:“bla”,“optional”:true,“version”:“1.00”}],“developerId”:“bla”,“email”:bla@gmail.com“,”名称“:”Bla bla2nd“}],”摘录“:”一些文本{摘录}!Bla.png |缩略图,边框=1!”,”gav“:”Bla“,”标签“:[”报告“,”scm相关“],”名称“:“plugin_name_foo_bar”,“previousTimestamp”:“bla”,“previousVersion”:“1.0”,“ReleaseTimstamp”:“bla”,“requiredCore”:“1”,“scm”:“github.com”,“sha1”:“ynnBM2jWo25ZLDdP3ybBOnV/Pio=”,“title”:“bla”,“url”:”http://bla.org,“版本”:“1.0”,“维基”:https://bla.org},“排除”:{“构建日期”:“bla”,“依赖项”:[],

然后,下一个插件块被直接粘贴。 我现在要做的是搜索
“plugin\u foo\u bar”:{“
,因为这是新插件描述块的唯一标识符。 我想替换随后出现的第一个sha1值。这就是我一直失败的地方。我总是获取整个文件中的第一个、最后一个或任何事件,而不是块:(
“title”
是sha1值后的唯一标识符

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

最后一次尝试是:
sed-i/(“name:”plugin\u name\u foo\u bar.*sha1:)([a-zA-Z0-9!@\$%^&*()\[\]]*)(“,”title“\)/\1blabla\2/1'
default.json

我希望有人知道——最好是一个更简单的方法——然后我继续尝试错误,直到我不得不呕吐和发狂

我在Windows上使用SED,所以Unix方法可能会帮助我了解如何批量实现这一点,但如果可能,请将其作为一行程序。转换脚本是一件非常痛苦的事情

我只需要SED,而不需要其他工具(如AWK)的解决方案。这完全不需要讨论

感谢您的帮助:)

干杯 Jan

不要使用正则表达式(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
不要使用正则表达式(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

正如斯普特尼克指出的,解析稍微超出了sed的意义。尽管如此,sed的图灵完成并强迫它做你想做的事情可以满足我们很多人不时感受到的那种{悲伤的、受虐狂的}冲动

这个更容易

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

正如斯普特尼克指出的,解析稍微超出了sed的意义。尽管如此,sed的图灵完成并强迫它做你想做的事情可以满足我们很多人不时感受到的那种{悲伤的、受虐狂的}冲动

这个更容易

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

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

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

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

sed -i -r "s/(plugin_name_foo_bar.+?sha1\": \")[^\"]+\"/\1abcdefghijkl\"/" default.json
sed-r“s/(plugin_name_foo_bar[^!]+sha1.:。[^\“]+/\1abcdefghijkl/”文件
sed-r“s/(plugin\u name\u foo\u bar[^!]+sha1:。[^\“]+/\1abcdefghijkl/”文件

首先,您给出的json部分似乎不完整,或者至少看起来不平衡。是否缺少一些文本?第二,在主文本中,您说您要搜索“plugin\u foo\u bar”:{…}。这是“plugin\u name\u foo\u bar”的拼写错误吗?您给出的sed示例是“name”:“plugin\u name\u foo\u bar”“,这有点不同,虽然两者都在“sha1”字段之前。您想说哪一个?我知道您必须有一个sed解决方案,但除非这是一个sed分配,否则我强烈建议查看
jq
()。jq是一个非常强大的命令行json操纵器(如果awk设计为本机读/写json,则有点像awk)。有windows 32位和64位二进制文件可用。最简单的jq解决方案大致类似于“jq-c”。plugin_name_foo_bar.sha1=“xyzy”“`片段确实不完整,但感兴趣的部分是这里的那一块。它重复了几百次。事实上有一个拼写错误。很抱歉:(“name”:“bla”应该是“name”:“plugin\u name\u foo\u bar”首先,您给出的json部分似乎不完整,或者至少看起来不平衡。是否缺少一些文本?其次,在主文本中,您说您要搜索“plugin_foo____bar”:{…}。这是“plugin_name_foo_______bar”的拼写错误吗?您给出的sed示例将查找“name”:“plugin_name_foo_________bar”“,这有点不同,虽然两者都在“sha1”字段之前。您想说哪一个?我知道您必须有一个sed解决方案,但除非这是一个sed分配,否则我强烈建议查看
jq
()。jq是一个非常强大的命令行json操纵器(如果awk设计为本机读/写json,则有点像awk)。有windows 32位和64位二进制文件可用。最简单的jq解决方案大致类似于“jq-c”。plugin_name_foo_bar.sha1=“xyzy”“这个片段确实不完整,但有趣的是这里的那一部分。它重复了几百次。事实上有一个典型的