2013-10-26 48 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