【问题标题】:Add a statement, retaining the second parameter of the function [closed]添加语句,保留函数的第二个参数[关闭]
【发布时间】:2015-06-03 13:22:55
【问题描述】:

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

我要换

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. Function_map(var33, 1.7);--> 如果存在

    Function_map(var33, 1.7);
    Funcion_map(var18,1.7)--> 在文件中也加入这一行

【问题讨论】:

    标签: perl unix awk sed


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

    解释:

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

    【讨论】:

      【解决方案2】:

      假设您正在运行版本 10 或更高版本的 Perl 5,您可以使用 \K (keep) 正则表达式结构来编写它。它允许在浮点数上使用前导 +- 符号

      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;
      

      这个替换的结果和上面的代码是一样的

      【讨论】:

        猜你喜欢
        • 2021-12-28
        • 2019-03-26
        • 2023-04-09
        • 2012-06-22
        • 1970-01-01
        • 1970-01-01
        • 2021-03-28
        • 2014-06-03
        • 1970-01-01
        相关资源
        最近更新 更多