我正面临着让我疯狂的局面。 我正在设置一个使用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的其他解决方案。这完全没有讨论。
感谢任何帮助:)
干杯 扬
答案 0 :(得分:1)
不要使用正则表达式(sed)来解析JSON,而是使用正确的JSON解析器,或者像我一样直接使用javascript:
在脚本中使用javascript和nodejs:
档案/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