Regex 文件中的正则表达式替换

Regex 文件中的正则表达式替换,regex,perl,file,Regex,Perl,File,我试图用Perl替换文件中的一组特定字符,但似乎不起作用,下面是我的代码 my $file = shift; open(FILE, "$file") or die "File not found"; while (<FILE>){ $data .=$_ } $data =~ s/[^A-CEGHJ-PR-TW-Z]{1}[A-CEGHJ-NPR-TW-Z]{1}\s?[0-9]{2}\s?[0-9]{2}\s[0-9]{2}\s?[A-DEM]{0,1}$/XX012345X/

我试图用Perl替换文件中的一组特定字符,但似乎不起作用,下面是我的代码

my $file = shift;
open(FILE, "$file") or die "File not found";
while (<FILE>){
   $data .=$_
}
$data =~ s/[^A-CEGHJ-PR-TW-Z]{1}[A-CEGHJ-NPR-TW-Z]{1}\s?[0-9]{2}\s?[0-9]{2}\s[0-9]{2}\s?[A-DEM]{0,1}$/XX012345X/g;

您要打开的文件是只读的。因此,您需要打开一个临时的第二个文件(),在其中写入$data变量,关闭它,删除第一个文件()和所需名称的临时文件

这可能会有帮助

离题说明:请使用现代的Perl方法来处理您的文件。例如:

open my $fh, "<", $filename or die "Cannot open file $filename"

打开我的$fh,“代码不会更改文件,因为您没有告诉它。您打开文件是为了读取,而不是写入,并且不打印任何内容

如果您想快速处理此问题,只需将regex替换放在一个文件中,并将其用作源文件。如下所示:

regex.pl的内容:

s/[^A-CEGHJ-PR-TW-Z]{1}[A-CEGHJ-NPR-TW-Z]{1}\s?[0-9]{2}\s?[0-9]{2}\s[0-9]{2}\s?[A-DEM]{0,1}$/XX012345X/g;
一艘班轮:

perl -p regex.pl inputfile.txt > output.txt

通过这种方式,您可以快速检查输出。您也可以通过管道发送到寻呼机命令,也可以根本不发送。

您可以在问题中发布一个示例文件吗?1.您不向该文件写入数据,只是从该文件中读取数据,所以为什么要更改该文件?2.您的正则表达式使用锚来匹配字符串的开头和结尾,您可以读取多行,或者你需要
m
修饰符来改变这种行为吗?也许你应该提到你希望你的代码能做什么。除非你打印
$data
,否则这段代码不会做任何事情。另外,在正则表达式的第一部分,你有
Z{1}
,看起来像是打字错误。哦,还有“它不起作用”“这是一种非常糟糕的方式来描述你的问题。它并没有说什么,是不是。“在我运行它之后,文件保持不变。”回答说。所做的编辑。我的意图在第一行很清楚,但为了清楚起见,我试图打开一个文件,对整个文件执行替换正则表达式。谢谢,谢谢你。我喜欢只做一行的想法。我用正则表达式稍微修改了一下。现在它是
/^[A-CEGHJ-PR-TW-Z]{1}[A-CEGHJ-NPR-TW-Z]{1}[0-9]{6}[A-DFM]{0,1}$/
,在regex测试网站中匹配时,它非常适合
AB123456C
。当我通过添加
/XX01234X/g
将其更改为替换时,它似乎不起作用。有什么想法吗?在重新移动
^
$
之后,现在似乎可以这样做了。有什么方法可以避免管道传输到另一个文件,而只修改原始文件?是的,您可以使用
-I
开关,该开关将在位编辑。建议使用备份,例如
-i.bak
(备份保存在
文件.txt.bak
中)。因此
perl-pi.bak regex.pl input.txt
我通常不建议初学者使用
-I
开关,因为这有点危险。更改是不可逆的,即使使用备份,也可以通过运行两次脚本来覆盖原始脚本(
file.txt.bak
被覆盖)。
perl -p regex.pl inputfile.txt > output.txt