使用perl在文本文件中以算术方式更改数字

时间:2014-12-26 23:36:50

标签: perl awk

我在文本文件中有一堆数字如下(例如

r0           = 204
r1           = 205
max_gap      = 20u
min          = 0
max = 8
thickness    = 2
color        = green
fill_under   = yes
fill_color   = green
r0           = 205
r1           = 206

我想用r0 = 100除以任何一行,这样该行就会读取

r0           = 20.4

我想对r0和r1的所有行都这样做。有没有办法在perl中执行此操作?

这是我的尝试,但不起作用主要是因为我之前从未使用过perl,这就是为什么我会问这么简单的问题

#!/usr/bin/perl

$string= r0\s+=\s+\\(d+)
$num= $1/100
$num2= r0\s+=\s+\\$num
s/$string/$num2;

我可以从bash运行的一个班轮将会好得多。我知道它将涉及s / find / replace函数但不确定如何指定整数部分

3 个答案:

答案 0 :(得分:3)

perl -pei 's#^(r[01]\s*=\s*)(\d+)$#$1.$2/100#e' filename

选项意味着:

  • -p =在打印修改后的输入
  • 的循环中运行代码
  • -e =执行第一个参数中的代码
  • -i =用输出
  • 替换输入文件

正则表达式位表示:

  • ^ =行首
  • r[01] = r0r1
  • \s*=\s* =任意数量的空白,=和任意数量的空白
  • \d+ = digits
  • $ =行尾

替换使用e修饰符,这意味着它应该作为Perl表达式执行。 $1$2是两个捕获组的内容:$1是数字之前的所有内容,$2是数字。 $2/100将数字除以100.将这两个部分连接在一起。

答案 1 :(得分:1)

作为一个单行:

perl -pi -e 's{^r[01]\s*=\s*\K(\d+)$}{$1/10}e' filename.txt

答案 2 :(得分:1)

以下是awk解决方案:

awk '/^r[01]/ {$3/=100} 1' file
r0 = 2.04
r1 = 2.05
max_gap      = 20u
min          = 0
max = 8
thickness    = 2
color        = green
fill_under   = yes
fill_color   = green
r0 = 2.05
r1 = 2.06