如何使用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
相关产品推荐
相关产品推荐

