perl 正则表达式 匹配多行的问题

我文件格式如下:

2_name_joseph
2_age_109
2_name_tifor
2_age_10
2_name_momo
2_age_29
2_name_joseph
2_age_29
...(很多行)
想要把里面joseph的年纪都替换为22

脚本如下,肯定不对,因为不能替换到两行,结果会多出一行原来的结果,请问怎么改?

得出的错误结果为
2_name_joseph
2_age_22
2_age_29
。。。。。

my $FilePath = <STDIN>;
chomp($FilePath);

if (-e $FilePath)
{
rename ($FilePath,$FilePath.".bak") || die "Cannot rename \n";
open (DATALOG_FILE, $FilePath.".bak") || die ("file ".$FilePath.".bak not found\n");
open (OUTPUT, ">".$FilePath.".temp");
while (<DATALOG_FILE>)
{

chomp($_);
if( /2_name_joseph/)
{
print OUTPUT "2_name_joseph\n2_age_22\n"
}
else
{
print OUTPUT $_."\n";
}
}
close(DATALOG_FILE);
close (OUTPUT);
rename ($FilePath.".temp",$FilePath) || die "Cannot rename back temp file. make sure you do not open the file\n";
}
else
{
print "file $FilePath not found\n";
}

第1个回答  2013-07-04
用你贴出来的数据调试了一下,可以得到正确结果,你用原文件试试看哦

use strict;
open FILEHANDLE,"<","f:/sample.txt" || die "can't open file:$!\n";
open LOG,">","f:/result.txt" || die "can't open file:$!\n";
my $row_matched;
while(my $var=<FILEHANDLE>){
if($var=~m/joseph/){
$row_matched=$.;
}
if($.==($row_matched+1)){
$var=~s/.*/2_age_22/;
print LOG "$var";
}
else{print LOG "$var";}
}追问

很奇怪 运行不了 也不报任何错

追答

我是在windows下编写的,DzSoft Perl Editor,检查一下文件路径,运行后在LOG句柄指定的目录里有没有新的文件产生?

追问

没有也,很奇怪 你是用activeperl?

追答

是的 activeperl 5.10

第2个回答  2013-07-04
看了一下你们写的代码,不晓得你明白了你的错误没有?
你的错误就在于读到joseph的时候你就把joseph那一行替换成了第二行为22的两行,但是读到joseph的下一行时你没做任何处理,所以依然打印出来了。

而biojamie的看起来就对了,他读到joseph的那一行的时候没有急于替代,只是做了一个标记,读到下一行的时候因为有这个标记,所以知道该替换这一行。我觉得他应该是对的。

不过我也不明白为什么你跑不了,实在不行的话你也修改一下你的脚本,用类似的理念就行。本回答被提问者和网友采纳
第3个回答  2013-07-04
perl -p -i -e '~s/joseph/32/' file

Perl的正则表达式的问题
\\2 代表模式里的第二个子表达式,在你这个例子里就是前面第二个括号所捕获的内容,也就是b,同理\\1是第一个括号所捕获的内容,也就是a 反向匹配就是指在模式的后半部分中引用在模式前半部分中定义的子表达式 记得给分啊

---请问这个perl的正则表达式~ s\/[\\n\\r]*\/\/g
AAA =~ s\/[\\n\\r]*\/\/g =~s\/A\/B\/g 在模式匹配是 替换,就是将内容A替换成内容B,后面的g是全局,就是全部替换成。[ AB ]出现在中括号的是任意的其中一个,\\n \\r是换行符 ,[\\n\\r]* *号是0个或以上 总起来:将$AAA中的所有的换行符全部替换为空,也就是将所有换行去掉。

perl 正则表达式中模式分组\/y((.)(.)\\3 \\2) d\\1\/ 是怎么匹配的?
所以\\1是表示((.)(.)\\3 \\2)中整个的内容,\\3表示((.)(.)\\3 \\2)中内嵌的第二个圆括号中的内容,\\2表示内嵌的第一个圆括号中的分组 \/y((.)(.)\\3 \\2) d\\1\/ 这个正则表达式中有空格,所以这个正则表达式可以匹配 y字符跟两个任意字符,重复第三个字符,一个空格,重复第二个字符,...

求一个正则表达式,在ultra edit中匹配同时出现几个单词的行。
一个正则表达式的我就想不出了,只能将每一行分出来,然后在判断每一行是否有那几个单词,都存在则返回true,否则false;我理解的是你那几个单词之间还能有别的单词,要是必须连在一块那就麻烦点,空行也不会有所影响!

如何使用Perl正则表达式匹配以">"开头"<"结尾且中间包含至少一个汉字且...
按照你的要求编写的perl程序如下(见图,正则表达式为左右两个斜杠中间部分)

!~ \/^\\d+$\/是什么意思
\\d+匹配多个数字字符串。所以\/^\\d+$\/ 表示匹配一整行中1个以上的数字。Perl的正则表达式的三种形式,分别是匹配,替换和转化:匹配:m\/\/(还可以简写为\/\/,略去m)替换:s\/\/\/ 转化:tr\/\/\/ 这三种形式一般都和 =~ 或 !~ 搭配使用, =~ 表示相匹配,!~ 表示不匹配。

打开文件1.txt有以下类型序列,要求以序列中的数字(70)为中点,向俩边各...
下面,我以下面的条件为例;假设1.txt每行都有如你说写的序列,然后我将其每行读入并处理,写到2.txt文档。其中如果70旁边不足12bp的话,将不会显示此行。核心提示:用正则表达式匹配。!\/usr\/bin\/perl -w use warnings;use strict;open IN, "1.txt" or die "no file";open OUT,">","2...

如何提高perl处理大文件的效率
[Dd]=something\\&\/,后者比前者快不止100倍;4)在匹配正则表达式时,如果匹配项是固定不变的,那么请使用o选项,这表示只对正则表达式编译一次,例如\/jsp\/io比\/jsp\/i好很多。5)while循环要比for\/foreach循环效率高,6)多用小括号,少用$&,$`,$'7)多余多行匹配推荐用s\/m修饰符,不推荐使用 ...

~ \/^\\"(.*)\\"\\s+\\<(\\d+)-?(\\d*)\\>\\s*$\/ perl模式匹配中这个表示什么意思...
^\\"以”开头,(.*)任意个字符,\\"匹配”,\\s+匹配一个以上的空白符,\\<匹配一个<,(\\d+)匹配一个以上的数字,-?匹配连字符-零次或一次,(\\d*)匹配0或零个以上的数字,\\>匹配>,\\s*$\/以0至0个以上的空白符结尾 (参考下正则表达式语法)...

$condition1 =~ s\/^s+|s+$\/\/g;perl中有这样的写法吗
有的,这是正则表达式替换,这一行完成的是 替换所有 连续的s开头或结尾的部分 condition1 =~ s\/^s+|s+$\/\/g;| | | --- | 待替换字符串 | ~是正则标识符 s指定操作为替换,语法是: =~s\/ \/ \/; 有三个斜杠,前两个斜杠内是匹配模式,后两个斜杠是 替换内容,无则替换为空。...

相似回答