我的意见:
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/;
}
}
答案 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'
但这就是你指定问题的方式。