- 论坛徽章:
- 0
|
本帖最后由 justu78 于 2016-12-23 15:01 编辑
我不是寻求解决方案的,这是咨询出现问题的代码的原因:
我有一个小文件,每行数据都是逗号分隔。但是有一行数据是空格分隔, 我想查找到这一行,然后直接把空格替换成逗号就好了,很简单吧,但是我最开始的想法出问题了,我这里想请假一下为什么我的匹配不成功。
代码很简单,我就是一开始定义了一个字符窜变量$number='(?:[+-]?)(?:[0-9]+[\.]?[0-9]*)|(?:[\.][0-9]+)(?:[eE][+-]?[0-9]+)?' , 然后用这个变量来匹配只有数据是空格分隔的某一行:/^\s*($number\s+)+ /, 我个人感觉这个正则表达式没有问题,但是最后运行结果显示是没有匹配到。请高手帮我解惑,这是为什么?(我知道最后换个方式解决其实非常简单,我只想知道为什么我想的这个正则表达式匹配不成功)
数据文件:
*
*All and any part of this file format is copyright protected.
*
3.2E-8, .0016, 25, 70, 1, 1, 2, 3, 4, 5
2.15E-13 1.77E-13 8.48E-13 1.515E-12 2.501E-12 4.583E-12 .01245 1.32
0, 1, .02
代码:
#!/bin/sh
eval 'exec perl -S -x -w $0 ${1+"$@"}'
#!perl
$self = $0;
$\ = "\n";
$, = " ";
$number = '(?:[+-]?)(?:[0-9]+[\.]?[0-9]*)|(?:[\.][0-9]+)(?:[eE][+-]?[0-9]+)?';
opendir( DIR, "." ) ||
die("ERROR: cannot open current directory, stopped");
@Files = grep( /^[^\.]/, readdir(DIR) );
closedir(DIR);
print $self;
foreach $file (@Files) {
$temp = quotemeta $file;
if ( $self =~ /$temp/i ) {
next;
}
print "processing data file: $file;";
$newfile = 'new_' . $file;
local $/;
open($IN, '<', "$file" ) || die("ERROR: cannot open file $file, stopped");
$line = <$IN>;
close($IN);
@lines = split( /\n/, $line );
$/ = "\n";
open( $OUT, '>', "$newfile" ) || die("ERROR: cannot open file $newfile, stopped");
print "writing new data file: $newfile;";
for ( $i = 0; $i <= $#lines; $i++ ) {
if ( $lines[$i] =~ /^\s*($number\s+)+ /i ) {
$lines[$i] =~ s/\s+/\,/ig;
}
print $OUT $lines[$i];
}
close($OUT);
}
|
|