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

如何用sed保留含科学计数法的数值并删除其他无关字符?

问题描述

我有如下text.txt文件:

$ cat text.txt
 An = 2, 3, 4, 5, 0.3
      3, 3, 4, 5, 0.5
      3, 4, 5, 6, -19
      4, 5, 5, 5, 10E+10

期望删除除数值(包括10E+10这类科学计数法格式)外的所有字符,输出结果如下:

$ Outfile.txt
2 3 3 4 0.3
3 3 4 5 0.5
4 4 5 5 -19
5 5 6 5 10E+10

但当前的sed脚本会误删科学计数法里的E,脚本内容:

$ script.sh
sed 's/[A-Z]//g;s/=//g;s/}//g;s/[a-z]//g;s/,//g' text.txt

请给出正确的解决方案。


方法1:修正sed脚本

原脚本的问题是s/[A-Z]//g会删除所有大写字母,包括科学计数法必需的E。我们可以调整正则,只删除不属于合法数值组成部分的字符:

sed -E 's/[^0-9.E+-]+/ /g; s/^ +| +$//g; s/ +/ /g' text.txt > Outfile.txt

逐段解释:

  • [^0-9.E+-]+:匹配所有不是数字、小数点、E、+、-的字符,替换为空格
  • s/^ +| +$//g:清除每行开头和结尾的冗余空格
  • s/ +/ /g:把多个连续空格合并成单个空格

方法2:用awk处理(更简洁直观)

awk默认按空格分割字段,我们可以直接过滤掉非数值字段,保留符合要求的内容:

awk '{for(i=1;i<=NF;i++) if($i !~ /[A-Za-z=]/) printf "%s ", $i; print ""}' text.txt | sed 's/ $//' > Outfile.txt

解释:

  • 遍历每行的每个字段,排除包含字母、等号的无效字段
  • 用sed 's/ $//'清除行尾多余的空格

或者用更严谨的正则匹配合法数值(支持整数、小数、科学计数法):

awk '{for(i=1;i<=NF;i++) if($i ~ /^[+-]?[0-9]+(\.[0-9]+)?([Ee][+-]?[0-9]+)?$/) printf "%s ", $i; print ""}' text.txt | sed 's/ $//' > Outfile.txt

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 16:03:10