【问题标题】:Find pattern and replace PLUS operation?查找模式并替换 PLUS 操作?
【发布时间】:2014-08-21 14:59:17
【问题描述】:

这可能在正则表达式中吗?假设我得到了这些条目:

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

有人可以引导我找到正确的正则表达式并替换吗?

谢谢!

编辑:发现正则表达式无法做到这一点,那么有什么工具可以帮助我解决这个问题吗?

【问题讨论】:

  • 也许现在是了解更好的编辑器的正确时机,比如 vim。使用 vim,可以轻松完成任务。顺便说一句,最后一行应该是5*1.4 而不是1*1.4 对吧?
  • 哦,是的,你说得对,好久没睡了,忘了数学,所以1仍然是1。现在正在下载vim for windows,那么如何才能做到这一点vim?
  • 如果你添加 vim 标签,我会用 vim 发布答案。一个命令就可以了。
  • @Kent 对不起,是的。实际上,花时间了解“vim 标签”是什么意思。哈哈。
  • 问题的标签。比如 csv ,notepad++ ,delimiter...

标签: csv vim notepad++ delimiter


【解决方案1】:

首先,我没有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(

【讨论】:

  • 投票为答案,因为它似乎是最简单的方法。谢谢!
【解决方案2】:

这是一个可以完成这项工作的 perl one 班轮:

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

【讨论】:

  • 它是否也将数字四舍五入,并删除小数点?抱歉,不知道 Perl,但会尝试,现在就下载。
猜你喜欢
  • 1970-01-01
  • 2022-10-05
  • 1970-01-01
  • 2014-09-30
  • 2021-11-17
  • 1970-01-01
  • 1970-01-01
  • 2017-10-22
  • 2021-07-28
相关资源
最近更新 更多