搜索&替换字符串中的字符

时间:2015-01-31 19:52:32

标签: regex perl tr

我正在尝试编写一个基本的Perl脚本来进行一些字符串操作。我将“Existing_Value_To_Be_Changed”和“New_Value”作为用户输入。

该文件有多个行块,如下所示 -

foo_bar_xyz000123 := abcd (100010                                       
        01010111111001011010001010); - (Not in same line as previous)

字符串的foo_bar_abc部分在文件中出现多次。它后面的唯一数字是每个外观的唯一数字。

当我在Perl中逐行遍历时,如何在0匹配后用1(New_Value)替换所有foo_bar_xyz(Existing_Value_To_Be_Changed)(在所有事件中)。但是我需要在(之后开始并继续执行以下行,直到遇到);并在此之后停止。

修改

我已经完成了关于导航到那些特定线条块的部分。我被困在角色搜索&替换部分。

$var = 'false';
while <File> {
  if (pattern matches) {
    $var = 'true';
  }
  if ($var eq "true") {
    push(@array, $_);
    if ( $_ contains ");" ) {
      $var = 'false';
    }
  }
}

当前行存储在变量中时,(仅在);部分之后进行替换的最佳方法是什么?

修改

Existing_Value_To_Be_Changed New_Value 是用户输入,如果一个为0,则另一个为1,反之亦然,因为它是一个只包含0和的二进制字符串1秒。

1 个答案:

答案 0 :(得分:0)

最简单的方法是在找到每个多行序列时执行转换。这个简短的程序证明了这一点。

您还没有描述输入文件的内容,所以我不得不猜测一些测试数据。可执行替换中的tr/0/1/r是更改数据的部分。

use strict;
use warnings;
use 5.014;    # For non-destructive substitution

while (<DATA>) {
  if (/foo_bar_xyz000123/) {
    $_ .= <DATA> until /\);/;
    s| ( \( [01\s]+ \) ) | $1 =~ tr/0/1/r |ex;
  }
  print
}
__DATA__
xx
yy
zz
foo_bar_xyz000123 := abcd (100010                                       
        01010111111001011010001010);
aa
bb
cc
foo_bar_xyz000123 := abcd (100010                                       
        01010111111001011010001010
        01010111111001011010001010
        01010111111001011010001010); 
dd
ee
ff

<强>输出

xx
yy
zz
foo_bar_xyz000123 := abcd (111111                                       
        11111111111111111111111111);
aa
bb
cc
foo_bar_xyz000123 := abcd (111111                                       
        11111111111111111111111111
        11111111111111111111111111
        11111111111111111111111111); 
dd
ee
ff