2014-06-17 191 views
1

我嘗試使用SED查找並以JSON給定鍵替換值:桑達正則表達式替換

myfile.json:

"firstKey" : "firstValue", "key" : "valueToReplace", "otherKey" : "otherValue", 

sed命令我嘗試:

sed 's/"key" : ".*",/"key" : "NewValue",/' myfile.json 

我對此有的結果:

"firstKey" : "firstValue", "key" : "NewValue", 

任何想法,我怎麼能的

", 

,而不是最後一次出現第一下一次出現匹配嗎?

+4

'[^「] *';匹配任何字符,除了雙引號 –

+0

'sed的「S/「key」:「。*」,「/」key「:」NewValue「,/'' –

+0

@Jidder:'」。*「'給出的內容太多了,拿@Tudor Berariu內容爲這部分 – NeronLeVelu

回答

1

你可以試試這個GNU sed的命令也,

sed -r 's/(\"key\" :)\"[^,]*/\1"Newvalue"/g' file.json 

例子:

$ echo '"firstKey" : "firstValue", "key" : "valueToReplace", "otherKey" : "otherValue",' | sed -r 's/(\"key\" :)\"[^,]*/\1"Newvalue"/g' 
"firstKey" : "firstValue", "key" : "Newvalue", "otherKey" : "otherValue", 
0

有兩件事你應該做的,你應該使用一個非貪婪的正則表達式(.*?)這是一個有用的事情在許多情況下做,我會建議使用它作爲標準(一般來說,你會希望非-greedy選項比貪婪選項更經常)。 這將使造成sed命令:

sed 's/"key" : ".*?",/"key" : "NewValue",/' myfile.json 

然而,這還不是一個很好的解決方案,它會做你想要什麼,但我覺得這是更好地想想你的正則表達式是說。與".*?"你說的是一個報價,然後是零或更多的一切,直到另一個報價,並選擇第一個(懶惰)。然而,這不完全是你想要的,你不希望那裏有一個報價,所以使用一個負面的捕獲組是最好的。 (通常很好的做法是從捕獲組中排除某些東西,並將其限制爲只有你需要的東西,這使得更清晰,更穩定和更可重用的正則表達式)。這是指出了意見,並給出:

sed 's/"key" : "[^"]*?",/"key" : "NewValue",/' myfile.json 
0

還有一個有趣的位置:轉義雙引號。也許你的值可以包含"字符。您可能要包括\"""在你的字符串:

sed 's/"key" : "\([^"]\|\(""\)\|\(\\"\)\)*",/"key" : "NewValue",/' myfile.json 

基本上你的每一個字符不是"或任何""序列或達到用雙引號之前的任何\"序列匹配。