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

