如何用Sed替换字符串的内容,而不是仅仅追加

时间:2015-08-10 20:11:54

标签: sed

我正在尝试修改具有特定结构的文件内容:

{
    "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我想替换该字符串后面的引号,而不是附加到它?

1 个答案:

答案 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"后跟零个或多个空格,后跟冒号,.*匹配所有内容跟着冒号。在正则表达式中,.匹配任何字符,因此.*匹配任何字符的零个或多个。这将匹配冒号后面的整行。