这是否可以在正则表达式?假设我有这些条目:
1005,15,0,0,0
1014,20,0,0,0
1084,3,360000,180000,1
1025,5,0,0,0
我应该拥有的是,找到一个在它之前有逗号的数字&完全,0,0,0
之后,将数字替换为其数字的140%
1005,15*1.4,0,0,0
1014,20*1.4,0,0,0
1084,3,360000,180000,1
1025,1*1.4,0,0,0
如果它有小数点,将其向上舍入1,并删除小数点,以便:
1025,1,0,0,0
=> 1025,2,0,0,0
决赛应该是,如:
1005,21,0,0,0
1014,28,0,0,0
1084,3,360000,180000,1
1025,2,0,0,0
有人可以带我到正确的正则表达式查找和替换吗?
谢谢!
编辑:弄清楚正则表达式无法做到这一点,那么任何可以帮助我的工具呢?
答案 0 :(得分:5)
首先,我没有Windows系统。要使用vim打开文件,我想它应该与vim foo.file
相同?
无论如何,回到你的问题,命令是:
:%s/\d\+\ze,0,0,0$/\=float2nr(ceil(submatch(0)*1.4))/
它的工作原理如下:
请注意,我添加了一个新行来显示ceil()的工作原理。
如果这是你第一次打开vim,你需要阅读一些教程。如果您有使用vim的经验,可以查看以下cmd的以下帮助详细信息:
:h :s
:h \ze
:h ceil(
:h submatch(
:h float2nr(
答案 1 :(得分:1)
这是一个执行工作的perl one liner:
perl -p -i.back -e "s/,(\d+)((?:,0){3})/','.(1.4*$1).$2/e" foo.txt
这将按需要替换,
之后的每个数字,然后将,0,0,0
后面的数字乘以1.4
。
在替换值之前,原始文件保存在filename.back中。
修改强>
如果你想要对结果进行舍入(即没有小数),你可以这样做:
perl -p -i.back -e "s/,(\d+)((?:,0){3})/','.sprintf('%d',(1.4*$1)).$2/e" foo.txt