如何用sed或awk在格式化JSON文件中匹配后插入行?
sed插入行报错的解决方法
问题背景
原始JSON内容:
{ "id": "a1234567-89ab-cdef-0123-456789abcdef", "properties": { ... "my_id": "c1234567-89ab-cdef-0123-456789abcdef", ... }
需求:匹配包含4个前导空格的my_id行,在其后插入新行 "my_value": "abcd",,期望输出:
{ "id": "a1234567-89ab-cdef-0123-456789abcdef", "properties": { ... "my_id": "c1234567-89ab-cdef-0123-456789abcdef", "my_value": "abcd", ... }
尝试执行命令:
sed '/.*"my_id".*/a "my_value": "abcd",' test.json
出现错误:command a expects \ followed by text
错误原因
- 正则匹配太宽泛:
.*"my_id".*会匹配所有包含my_id的行,无法精准定位到4个前导空格的目标行 - sed语法不符合标准:POSIX规范下,
sed的a(追加)命令要求在a后加反斜杠\并换行,才能指定要插入的内容;非GNU版本的sed不支持a后直接跟内容的写法
正确命令写法
方法1:兼容POSIX标准的通用写法(适用于所有sed版本)
sed '/^ ""my_id":.*/a \ ""my_value": "abcd",' test.json
- 正则
^ ""my_id"::^匹配行首,后面跟4个空格,确保只匹配目标层级的my_id行 a命令后加\并换行,符合POSIX sed的语法要求,指定要插入的内容
方法2:GNU sed简化写法(仅Linux等使用GNU sed的环境)
GNU sed允许a命令后直接跟插入内容,无需换行转义:
sed '/^ ""my_id":.*/a ""my_value": "abcd",' test.json
内容的提问来源于stack exchange,提问作者flybonzai
相关产品推荐
相关产品推荐

