2013-10-26 45 views
1

我正面临一个让我疯狂的局面。 我正在设置使用json文件的更新服务器。 不要问为什么或如何,它很烂,是我唯一的可能性。sed--试图在比赛后取代第一次出现

我一直在努力和研究小时(很多),因为我去弹道,想要自己破解这个。但我必须意识到我陷入困境并需要帮助。

因此,对于这个区块抱歉,但我认为这是看有点重要...

的文件是一个内衬和重复不断变化的值(当然)按以下顺序。

"plugin_name_foo_bar": {"buildDate": "bla", "dependencies": [{"name": "bla", "optional": true, "version": "1.00"}], "developers": [{"developerId": "bla", "email": "[email protected]", "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": ")([[email protected]#\$%^&*()\[\]]*)(", "title"\)/\1blablabla\2/1' default.json

找到该插件的SHA1值,但仍然没有喜悦,我希望有人知道 - 最好是一个更简单的方法 - 之前,我现在继续。试验和错误,直到我不得不呕吐和发作。

我在Windows上使用SED,所以Unix方法可能会帮助我弄清楚如何在批处理中实现这一点,但如果可能的话,请将它作为一行。脚本是一个真正的转换痛苦。

而我只需要SED,而不需要其他工具,比如AWK。这绝对没有讨论。

任何帮助表示赞赏:)

干杯 月

+0

首先,JSON的你给的部分似乎不完整,或至少它不” t似乎是平衡的。是否有一些缺失的文字?其次,在主文本中,你说要搜索''plugin_foo_bar':{...}“。这是''plugin_name_foo_bar''的拼写错误吗?你给的sed例子看起来是''name': “plugin_name_foo_bar”',虽然两者都在''sha1''字段之前有所不同,但是你想说哪一个? –

+0

我知道你必须有一个sed解决方案,但除非这是一个sed任务,否则我会强烈建议查看'jq'(http://stedolan.github.io/jq/)。jq是一个非常强大的命令行json操纵器(有点像awk,如果awk被设计为本地读取/写入json)。有32位和64位二进制文​​件可用,最简单的jq解决方案大致类似于'jq -c'.plugin_name_foo_bar.sha1 =“xyzzy”' –

+0

这段代码实际上并不完整,但感兴趣的部分就是那个特定的部分在这里它重新发生了几百次 事实上一个错字。对不起:( “名称”:“bla”应该是“名称”:“plugin_name_foo_bar” – wakkaluba

回答

0

由于sputnick指出解析有点超出了sed中的意味着。尽管如此,sed的图灵完成并将其变成你想做的事情,可以满足我们许多人时常感受到的{sad,masoch} istic的渴望。

这个人很简单。

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

谢谢队友:) 你的解决方案确实出于某种原因不适合我,但你确实为我提供了一个新的PoV如何解决这个问题。 只需将文件分解成更多可管理的块。 ('type latest.txt')do( \t sed -i's/\(%% i。* sha1“:”\“)( ”for/f“tokens = 1,2 delims =”% 。* \(“},\)/ \ 1 %% j \ 2/1'default.json )' 那么我真的在找什么。 – wakkaluba

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" : "[email protected]", 
      "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 
+0

这个想法很诱人,但我在一个非常严格的环境中工作:/ – wakkaluba

+0

http://tnovelli.net/blog/ blog.2011-08-27.node-npm-user-install.html –

0

for Windows命令行,与转义引号,替换内联和使用正则表达式

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