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

如何使用sed定位列并修改以e-3*结尾的条目为0?

用sed正确替换CSV列中以"e-3*"结尾的条目

我有一个包含3列的文件,列以逗号分隔,每行用方括号包裹。需要将所有行中以e-3*结尾的条目替换为0。

输入示例

[6.902532920683853e-31,42,27.600000381469727],
[6.902532920683853,42e-31,27.600000381469727],
[6.902532920683853e,42,27.600000381469727e-32],

期望输出

[0,42,27.600000381469727],
[6.902532920683853,0,27.600000381469727],
[6.902532920683853e,42,0],

我尝试过这个sed命令:

cat columns.test | sed 's/[0-9].*e-31/0/'

但它无法正确定位列,会误删其他列内容,得到错误结果:

[0,42,27.600000381469727],
[0,27.600000381469727],
[0],

正确的sed解决方案

你需要通过列边界定位和精准的正则匹配来避免误替换,以下是可行的sed命令:

基础版本(处理列中间的目标条目)

sed -E 's/([[,])[0-9.]+e-3[0-9]([,])/\10\2/g' columns.test

完整版本(同时处理行尾的目标条目)

考虑到部分目标条目可能在行末(结尾是]而非逗号),可以调整正则覆盖这种情况:

sed -E 's/([[,])[0-9.]+e-3[0-9]([,]|])/\10\2/g' columns.test

命令解释

  • -E:启用扩展正则表达式,简化语法
  • ([[,]):捕获列的起始边界(左方括号[或逗号,),确保只匹配完整列的开头
  • [0-9.]+:匹配数值部分的数字和小数点,避免过度匹配
  • e-3[0-9]:精准匹配e-3后跟任意数字的目标格式
  • ([,]|]):捕获列的结束边界(逗号,或右方括号]),保证列结构完整
  • \10\2:替换为「捕获的起始边界 + 0 + 捕获的结束边界」,保留原有列分隔结构
  • g:全局替换,处理一行中所有符合条件的列

如果你的sed版本不支持-E,可以使用基本正则表达式写法:

sed 's/\([[,]\)[0-9.]\+e-3[0-9]\([,]|\]\)/\10\2/g' columns.test

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 15:56:19