添加一个语句,保留该函数的第二个参数

时间:2015-03-30 13:38:38

标签: perl unix awk sed

我有一个包含大量数据的庞大文件。

我想替换

Function_map(var33, 1.95);

Function_map(var33, 1.95);\nFunction_map(var18, 1.95);

1.95的价值各不相同。

例如:

  1. Function_map(var33,1.95); - >如果存在

    Function_map(var33,1.95);
    Funcion_map(var18,1.95) - >在文件

  2. 中也添加此行
  3. Function_map(var33,1.7); - >如果存在

        Function_map(var33,1.7);
    Funcion_map(var18,1.7) - >在文件

  4. 中也添加此行

2 个答案:

答案 0 :(得分:3)

perl -i~ -pe '$_ .= "${1}18$2\n" if /(Function_map\(var) 33 (,[ ][0-9.]+\);)/x' input

说明:

  • -p逐行处理文件
  • -i~“就地”更改文件,创建filename~备份
  • 如果正则表达式匹配,则33之前的所有内容都存储在$ 1中,并且在它之后的所有内容都会转到$ 2;并且那些中间有18个的结果被附加到要打印的行上。

答案 1 :(得分:0)

假设你正在运行Perl 5的10或更高版本,你可以使用\K(keep)regex构造来编写它。它允许在浮点数

上引出+-个符号
use strict;
use warnings;
use 5.010;

my $s = 'Function_map(var33, 1.95);';

$s =~ s/Function_map\(var33,\s*([+\-0-9.]+)\);\K/\nFunction_map(var18, $1);/;

say $s;

<强>输出

Function_map(var33, 1.95);
Function_map(var18, 1.95);

如果要更改手动输入的代码,那么您可能希望在与语句含义无关的位置添加可选空格。并且使用/x修饰符允许您向模式添加无关紧要的空白将是有利的。喜欢这个

$s =~ s{
    Function_map \s* \( var33 \s* , \s* ([+\-0-9.]+) \s* \) \s* ;
    \K
}{\nFunction_map(var18, $1);}x;

此替换的结果与上面代码的结果相同