替换文件中双引号中的第三个单词

替换文件中双引号中的第三个单词

这是json我们要编辑的文件

实施例1

{
  "topics": [{"topic": "hfgt_kejd_tdsfd”}],
  "version": 1
}

实施例2

{
  "topics": [{"topic": "hfgt_kj_fsrfdfd”}],
  "version": 1
}

我们想topics用其他单词替换该行中的第三个单词(通过 sed 或 perl oneliner )

关于示例1, 当我们想要替换hfgt_kejd_tdsfd为时的预期结果test_1

{
  "topics": [{"topic": "test_1”}],
  "version": 1
}

实施例3

more /tmp/file.json

{
  "topics": [{"topic": "TOPIC_GGGG”}],
  "version": 1
}


# sed  's/\(topic\": "\)[a-z_]*/\1test_1/'  /tmp/file.json

{
  "topics": [{"topic": "test_1TOPIC_GGGG”}],
  "version": 1
}

答案1

使用jq

$ jq '.topics[0].topic |= "test_1"' file.json
{
  "topics": [
    {
      "topic": "test_1"
    }
  ],
  "version": 1
}

topic这会读取 JSON 文档并将数组第一个元素的条目值修改topics为字符串test_1

如果变量中有值(以 UTF-8 编码):

$ val='Some value with "double quotes"'
$ jq --arg string "$val"  '.topics[0].topic |= $string' file.json
{
  "topics": [
    {
      "topic": "Some value with \"double quotes\""
    }
  ],
  "version": 1
}

使用 Perl:

$ perl -MJSON -0777 -e '$h=decode_json(<>); $h->{topics}[0]{topic}="test_1"; print encode_json($h), "\n"' file.json
{"topics":[{"topic":"test_1"}],"version":1}

使用变量:

$ val='Some value with "double quotes"'
$ STRING=$val perl -MJSON -0777 -e '$string = $ENV{STRING}; utf8::decode $string; $h=decode_json(<>); $h->{topics}[0]{topic}=$string; print encode_json($h), "\n"' file.json
{"topics":[{"topic":"Some value with \"double quotes\""}],"version":1}

这两者都使用 PerlJSON模块来解码 JSON 文档,更改需要更改的值,然后输出重新编码的数据结构。错误处理留作练习。

对于第二段代码,要插入的值作为环境变量传递STRING到 Perl 代码中。这是因为使用 以“slurp”模式从文件读取 JSON 文档-0777

答案2

不要使用匹配[A-Za-z_](顺便说一下,在大多数语言环境中,它比英文字母和下划线匹配得多),而是使用[^"]for"(顺便说一句,您问题中的示例有一个(U+201D, RIGHT DOUBLE QUOTATION MARK) 而不是 json 引号 ( ", U+0022, QUOTATION MARK) 作为主题名称后面的结束引号,我假设您的原始示例中不是这种情况文件,因为这会使其无效 json):

sed 's/\("topic": "\)[^"]*/\1test_1/' < file.json

(请注意,您有责任确保主题名称替换正确地进行 JSON 编码:UTF-8 字符集、编码的控制字符(如\n换行符)和"编码为\")。

答案3

sed -i 's/\(topic\": "\)[A-Za-z_]*/\1test_1/' file.json

相关内容