找到匹配的模式后如何追加和行

时间:2016-10-22 19:54:49

标签: perl

我想搜索文件中的字符串以及是否找到搜索字符串 那么我想根据花括号中的值替换三行。

我正在经历堆栈溢出的解决方案之一

Perl - Insert lines after a match is found in a file     被发现的功能于一个文件

但事情对我不起作用 INPUT_FILE:

abcdef1{3} { 0x55, 0x55, 0x55 }
abcdef2{2} { 0x55, 0x55}

代码:

use strict;
use warnings;
my $ipfile  = 'input.txt';
open my $my_fh "<", $ipfile  or die "Couldn't open input file: $!";
while(<$my_fh>)
{
 if (/$abcdef1/)
 {
 s/abcdef1{3} {\n/abcdef1{3} {\nabcdef1 0x55\nabcdef1 0x55\nabcdef1 
 0x55\n/gm;

}
}

预期产出:

abcdef1 0x55
abcdef1 0x55
abcdef1 0x55
abcdef2 0x55
abcdef2 0x55

任何有关解释的帮助都将不胜感激。

1 个答案:

答案 0 :(得分:3)

perlreRE.info中注意,使用${ ... }在正则表达式中具有特殊含义。您可能看不到输出,因为您缺少至少一个print语句。除非您要验证第二个机箱中系列的长度,否则第一个卷曲机箱(即:{\d+})可以是可选的。

您的循环可能类似于:

while (<$my_fh>) {
  if (/
      ^               # beginning of line
      ([^{]+)         # the base pattern captured in $1 ("non-left curly braces")
      .*              # any number of characters
      \{\s*(.*?)\s*\} # the data section surrounded by curlies captured in $2
      $               # end of line
      /x)          # allow whitespace and comments
  {
    for my $val (split /, /, $2) {
      print "$1 $val\n";
    }
  } else {
    print;
  }
}

或更简洁:

while (my $line = <$my_fh>) {
  if ($line =~ /^([^{]+).*\{\s*(.*?)\s*\}$/) {
    $line = '';
    $line .= "$1 $_\n" for split /, /, $2;
  }
  print $line;
}

模式?中的.*?表示非贪婪匹配。在这种情况下,它避免匹配第二个右大括号旁边的空白。