2015-10-10 119 views
1

我有一个文件,其中包含大量文本和一些描述数字的数字< 1,其中包含三位数字的准确性。我想用大致相等的整数百分比替换这些数字(数字0-99)。使用sed替换模式

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

这将是很好的正确,但不是必需的。

我已经尝试了以下几个变种,我似乎无法获得连一个比赛:

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

我理解的意思,符合数字0,那么小数,捕捉下数字和sed取代整个比赛与捕获的部分?

即使我得到这个工作,我不知道如何处理0.063 -> 6的情况。当然会在这上面伸出援助之手。

+1

我会使用awk,python或ruby或任何其他脚本语言。使用这些,格式化+舍入数字将不成问题。 – AlexN

回答

1

sed不支持字符类,但使用较长的POSIX名称。数字是[[:digit:]]。它只写[0-9]

试试这个:

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

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

s/0\.([0-9][0-9]).*/\1/:把0后面的两个数字和一个点放到一个捕获组中,并用这个捕获组替换整个字符串。

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

+0

我正在拉我的头发试图把所有的东西放在一个正则表达式中...完全忘了我们可以使用很多! – texasbruce

+0

当我阅读手册页时,第二条命令刚进入我的脑海 –

0

除了sed答案佐夫给了,你可以用awk更好地执行(与圆角):

#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 

一个bash唯一实现:

#round down 
while read n; do result=$(bc <<< "$n*100"); echo ${result%%.*}; done < myfile.txt 
#round up 
while read n; do result=$(bc <<< "$n*100"); printf "%.f\n" $result; done < myfile.txt 
0

这可能会为你工作(GNU SED ):

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

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