You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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 删除所有其他行

错误原因解析

  1. 语法混淆:你错误将删除命令d放到了替换命令s///的替换位置,替换命令的格式是s/匹配模式/替换内容/标记,不能直接用d作为替换值。
  2. 正则转义错误:在GNU sed的扩展正则模式(-E)下,{}不需要转义,转义后会变成匹配字面量的\{和\},导致无法匹配文件中的实际花括号。

内容的提问来源于stack exchange,提问作者MyICQ

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 11:25:16