在Windows下使用sed捕获花括号组编辑重复JSON对象失败求助
Windows下用GNU sed处理重复JSON对象的畸形文件
问题场景
原始JSON文件内容(存在重复对象,每行一个):
{"hello":"there"} {"hello":"there"}
需求:仅保留第一个JSON对象,丢弃后续所有内容,实现原地编辑。
之前的错误尝试及结果
使用Michael M. Builov补丁版(GNU sed) 4.9测试时,正则匹配及转义尝试均失败:
# 原正则表达式尝试(语法错误) sed.exe -E "s,^({.*?}).*,d,g" double.json -> -e expression #1, char 16: Invalid preceding regular expression # 转义括号尝试(语法错误) sed.exe -E "s,^\({.*?}\).*,d,g" double.json -> -e expression #1, char 18: Invalid content of \{\} # 转义花括号尝试(匹配失败) sed.exe -E "s,^\(\{.*?\}\).*,d,g" double.json -> 可运行但未匹配,返回原文件
解决方案及原理
方法1:针对单行对象的快速处理(适合你的场景)
如果每个JSON对象单独占一行,直接删除第二行到文件末尾的内容:
sed.exe -i "2,$d" double.json
原理:2,$ 指定行范围为第2行到最后一行,d 命令删除该范围内的所有行,仅保留第一行。
方法2:通用处理(支持对象跨多行)
如果JSON对象可能跨多行,匹配第一个完整的{...}对象后删除后续所有内容:
sed.exe -i -E '0,/^\{.*\}$/{//p};d' double.json
原理:
0,/^\{.*\}$匹配从文件开头到第一个符合{...}格式的行的范围{//p}打印这个范围内匹配到的行(即第一个JSON对象所在行)d删除所有其他行
错误原因解析
- 语法混淆:你错误将删除命令
d放到了替换命令s///的替换位置,替换命令的格式是s/匹配模式/替换内容/标记,不能直接用d作为替换值。 - 正则转义错误:在GNU sed的扩展正则模式(
-E)下,{}不需要转义,转义后会变成匹配字面量的\{和\},导致无法匹配文件中的实际花括号。
内容的提问来源于stack exchange,提问作者MyICQ
相关产品推荐
相关产品推荐

