2014-06-17 155 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 

基本上你的每一个字符不是"或任何""序列或达到用双引号之前的任何\"序列匹配。