Sed正则表达式替换

时间:2014-06-17 13:44:12

标签: regex json bash sed

我尝试使用sed在json中找到并替换给定键的值:

myfile.json:

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

我尝试使用sed命令:

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

我对此的结果:

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

任何想法,我怎样才能匹配第一次出现的

",

而不是最后一次出现?

3 个答案:

答案 0 :(得分: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",

答案 1 :(得分:0)

你应该做两件事,你应该使用非贪婪的正则表达式(.*?)这在许多情况下都是有用的事情,我建议将它作为标准使用(一般情况下你会比贪心选项更经常地想要非贪婪的选项。 这将产生生成的sed命令:

sed 's/"key" : ".*?",/"key" : "NewValue",/' myfile.json
然而,这仍然不是一个很好的解决方案,它会做你想要的,但我发现最好考虑你的正则表达式是什么。使用".*?",你会说一个引用,然后是零或更多的一切,直到另一个引用并选择第一个(懒惰)。但是,这并不是您想要的,您不希望在该组中有引号,因此使用负捕获组将是最佳选择。 (将捕获组中的内容排除在外并将其限制为仅需要的内容通常是一种好习惯。这样可以更清晰,更稳定,更可重复使用正则表达式。这在评论中指出并给出:

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

答案 2 :(得分:0)

此处还有另一个有趣的方面:​​转义双引号。也许您的值可以包含"字符。您可能希望在字符串中加入\"""

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

基本上,在匹配结束双引号之前,您匹配的每个字符都不是"或任何""序列或任何\"序列。