【发布时间】:2017-09-20 11:23:38
【问题描述】:
我想匹配第五列,即“,,”和“,,,”和“,”,除了新行,即“\n”,然后用某个值替换它们。以下是由空格分隔的文件。我尝试了以下代码: 注意:尽管该示例在第五列中显示了逗号。它可以是除换行符 (\n) 之外的任何字符(包括制表符 \t)。
my $delimiter="**";
my $dir_to_check=$DIR;
opendir my $DIR, $dir_to_check or die "Error in opening dir '$dir_to_check' because: $!";
my @files = readdir($DIR);
closedir($DIR);
foreach my $file (@files)
{
if($file =~ /\.fmt/)
{
unless ( open( CONTRL_FILE, "< $dir_to_check/$file" ) ) {
print "error while opening file $dir_to_check/$file \n"
} # UNLESS
if ($file eq 'test.fmt')
{
unless ( open( CONTRL_FILE_1, "> $dir_to_check/$file.temp" ) ) {
print "error while opening file $file \n"
} # UNLESS
while(<CONTRL_FILE>)
{
$_ =~ s/"[^\s]+"/"$delimiter"/ ;
print CONTRL_FILE_1 $_;
}
close(CONTRL_FILE_1);
}
}
}
数据:
1 SQLCHAR 0 5 ",,," 1 ""
2 SQLCHAR 0 25 ",,,," 2 ""
3 SQLCHAR 0 1 "," 3 ""
4 SQLCHAR 0 12 "," 4 ""
5 SQLCHAR 0 1 "\n" 5 ""
结果:
1 SQLCHAR 0 5 "*****" 1 ""
2 SQLCHAR 0 25 "*****" 2 ""
3 SQLCHAR 0 1 "*****" 3 ""
4 SQLCHAR 0 12 "*****" 4 ""
5 SQLCHAR 0 1 "*****" 5 ""
预期结果:
1 SQLCHAR 0 5 "**" 1 ""
2 SQLCHAR 0 25 "**" 2 ""
3 SQLCHAR 0 1 "**" 3 ""
4 SQLCHAR 0 12 "**" 4 ""
5 SQLCHAR 0 1 "\n" 5 ""
【问题讨论】:
-
实际上在上面的例子中它是逗号,但它可以是非空白字符的任意组合。
-
你可以试试:
perl -pe 's/(?<=")[^ \\]+(?=")/*****/g;' file吗? -
代替
[^\s]+使用:[^ \\]也可以忽略\n -
^[^"\v]*?"\K((?!\\n)[^"\v]+)(?=")使用m修饰符和**作为替代? -
@ctwheels 解决方案对我有用,谢谢。