这是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