regex 使用sed替换模式

axr492tv  于 12个月前  发布在  其他
关注(0)|答案(3)|浏览(103)

我有一个文件,其中包含大量文本和一些数字,这些数字描述了精度为三位数的< 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的情况下。当然会感激这方面的帮助。

disho6za

disho6za1#

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//:从上面的字符串中删除前导零。

fslejnso

fslejnso2#

除了Zoff给出的sed答案外,你还可以使用awk来更好地实现(使用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 only实现:

#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

hrirmatl

hrirmatl3#

这可能对你有用(GNU sed):

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

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

相关问题