使用sed替换模式

时间:2015-10-10 04:32:52

标签: regex sed

我有一个包含大量文本的文件和一些描述数字的数字< 1具有三位精度。我想用大致相等的整数百分比(数字0-99)替换这些数字。

0.734 -> 73
0.063 -> 6
0.979 -> 97

圆正确地圆,但不是必需的。

我尝试了以下几种变体,我似乎无法获得一场比赛:

sed -e 's/0\.(\d\d)/&/' myfile.txt

我理解的意思是,匹配数字0,然后是小数,捕获数字旁边的并且sed用捕获的部分替换整个匹配?

即使我让它工作,我也不知道如何处理0.063 -> 6案件。当然会对此有所帮助。

3 个答案:

答案 0 :(得分:1)

sed支持字符类但使用更长的POSIX名称。数字为[[:digit:]]。只需写[0-9]就可以了。

试试这个:

sed -E 's/0\.([0-9][0-9]).*/\1/;s/^0//' myfile.txt

-E标志告诉它使用现代正则表达式。这里实际上有两个命令,由;分隔:

s/0\.([0-9][0-9]).*/\1/:将0后面的两位数字和一个点放入捕获组,并将整个字符串替换为此捕获组。

s/^0//:从上面的字符串中删除前导零。

答案 1 :(得分:0)

除了Zoff给出的tsv回答之外,您可以使用awk更好地实现(使用舍入):

sed

仅限bash实现:

#round down
awk '{print int($1*100)}' myfile.txt
#0.979 -> 97

#round up
awk '{printf "%.0f\n",$1*100}' myfile.txt
#0.979 -> 98

答案 2 :(得分:0)

这可能适合你(GNU sed):

sed -r 's/0\.(([1-9][0-9])|0([0-9])).*/\2\3/' file

这使用交替和反向引用(BR)来匹配所需的模式。 如果第一个模式匹配第二个BR将返回该值,第三个(BR)将为空。同样,如果交替中的第二个模式匹配,则第二个BR将为空,第三个BR将返回所需的值。