更换后无法读取分割线

时间:2016-10-24 17:44:41

标签: perl

我的意见:

mySql1 10,10,10 type  
mySql2 10,10,10 type
mySql3 10,10,10 type

我试图在输入文件中搜索字符串mysql并想要拆分 这样我就想逐行读取分割字符串。

mySql 10
mySql 10
mySql 10 

我能够读取第一个分割线“mysql 10”,但我失踪了 接下来两行。

我的代码有什么问题?

我的代码:

use strict;
use warnings;
my $find ="mySql1 10,10,10 type";
my $replace ="\nmySql1 10\nmySql1 10\nmySql1 10 ";

while(<$fh>)
{
    if (/^mySql/)
    {
        s/$find/$replace/;
    }
}

1 个答案:

答案 0 :(得分:-1)

<强>脚本

#!/usr/bin/env perl

use strict;
use warnings;

while (<DATA>) {
    s/^mySql(\d)    # the literal string 'mySql' followed by a digit.
                    # We capture that digit as $1.
      \s            # a space
      (\d+),        # digits (your '10'), followed by a ',', captured as $2
      \2,           # that very same digits again (i.e. again '10')
      \2            # once again
      \s            # a space
      type          # literal 'type'
      /mySql$1 $2\nmySql$1 $2\nmySql$1 $2\n/x;
    print;
}

__DATA__
mySql1 10,10,10 type
mySql2 10,10,10 type
mySql3 10,10,10 type

<强>输出

mySql1 10
mySql1 10
mySql1 10

mySql2 10
mySql2 10
mySql2 10

mySql3 10
mySql3 10
mySql3 10

<强>解释

我将/x开关添加到s///命令。它允许 在查找模式中的注释等。我解释了正则表达式 在上面的代码中。

替换只是mySql$1 $2\n的三倍。 $1是 第一个捕获组的内容(您的数字1,2,3)和 $2是第二个捕获组(您的10个)的内容。

请注意,这仅适用于您的确切输入。它将捕获以下任何内容:

mySql4 11,12,13 type      # different numbers
mySql5 10,10,10,10 type   # not three numbers (but four)
mySql10 10,10,10 type     # two digits after 'mySql'

但这就是你指定问题的方式。