【问题标题】:replace capture match with capture group in bash GNU sed在 bash GNU sed 中用捕获组替换捕获匹配
【发布时间】:2018-04-27 04:13:24
【问题描述】:

我在下面列出的其他帖子中四处寻找我的问题的解决方案,但看起来我的正则表达式完全不同,需要特别注意: How to output only captured groups with sed Replace one capture group with another with GNU sed (macOS) 4.4 sed replace line with capture groups

我正在尝试替换大 JSON 文件中的正则表达式匹配组, 我的文件有 mongoDB 导出的对象,我正在尝试用字符串替换 objectId:

{"_id":{"$oid":"56cad2ce0481320c111d2313"},"recordId":{"$oid":"56cad2ce0481320c111d2313"}}

所以原始文件中的输出应该是这样的: {"_id":"56cad2ce0481320c111d2313","re​​cordId":"56cad2ce0481320c111d2313"}

这是我在 shell 中运行的命令:

sed -i 's/(?:{"\$oid":)("\w+")}/\$1/g' data.json

我没有收到任何错误,但文件保持不变。 我到底做错了什么?

【问题讨论】:

  • 不要使用正则表达式修改json,使用jq之类的..
  • $oid 的值是多少?
  • $oid 值是一个字符串,所以当你从 mongo 导出一个集合时,_id 键被导出为 Object:"_id":{"$oid":"56cad2ce0481320c111d2313"}

标签: sed


【解决方案1】:

我终于设法让它工作了,正则表达式在 bash 中的工作方式与 regexr.com 测试工具不同。

echo '{"$oid":"56cad2ce0481320c111d2313"}' | sed 's/{"$oid":\("\w*"\)}/\1/g'

给出正确的输出:

"56cad2ce0481320c111d2313"

我发现从标准输入读取并输出到文件更好,而不是先写入 JSON 文件,然后再读取、替换和写入。

由于我使用 mongoexport 导出集合,替换 objectId 并将输出写入 JSON 文件,我的最终解决方案如下所示:

mongoexport --host localhost --db myDB --collection my_collection | sed 's/{"$oid":\\("\\w*"\\)}/\\1/g' >> data.json
猜你喜欢
  • 2017-12-05
  • 2017-05-02
  • 2018-07-23
  • 1970-01-01
  • 1970-01-01
  • 2017-04-08
  • 2021-11-14
  • 1970-01-01
  • 2019-12-02
相关资源
最近更新 更多