我正在尝试修改具有特定结构的文件内容:
{
"name" : "thename",
"value" : {
"a" : "123",
"b" : "456"
}
}
我想替换a或b的内容;但我只能附加值,而不是替换引号中的内容。例如,对于a而不是123,我想放999。
sed -i 's/"a":*/"a": "999"/g' myfile.txt
但我得到的是
{
"name" : "thename",
"value" : {
"a" : "999" "123",
"b" : "456"
}
}
如何告诉sed我想替换该字符串后面的引号,而不是附加到它?
答案 0 :(得分:2)
尝试:
$ sed 's/"a" *:.*/"a" : "999"/' myfile.txt
{
"name" : "thename",
"value" : {
"a" : "999"
"b" : "456"
}
}
问题是sed使用正则表达式,而不是 globs 。因此,"a":*
匹配"a"
后跟零个或多个冒号。因为,在上面的示例文件中,"a"
后跟一个空格,这只匹配"a"
。
在上面的代码中,"a":*
被"a" *:.*/
替换为匹配"a"
后跟零个或多个空格,后跟冒号,.*
匹配所有内容跟着冒号。在正则表达式中,.
匹配任何字符,因此.*
匹配任何字符的零个或多个。这将匹配冒号后面的整行。