Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 在Perl中,如何匹配两个连续的回车?_Regex_Windows_Perl_Match_Carriage Return - Fatal编程技术网

Regex 在Perl中,如何匹配两个连续的回车?

Regex 在Perl中,如何匹配两个连续的回车?,regex,windows,perl,match,carriage-return,Regex,Windows,Perl,Match,Carriage Return,嗨,朋友们 我在Windows平台上;我有一个数据文件,但发生了错误,(我不知道为什么)“回车+换行”的所有组合都变成了“回车+回车+换行”,(190128编辑:)例如: 以纯文本形式查看文件时,它是: 以十六进制模式查看同一文件时,它是: 出于实际目的,我需要删除双“0D”中的额外“0D”,如“…30 30 0D 0A 30 30…””,并将其更改为“…30 30 0D 0A 30…”” 190129编辑:此外,为了确保我的问题可以重现,我将数据文件上传到GitHub的URL(使用前应下载

嗨,朋友们

我在Windows平台上;我有一个数据文件,但发生了错误,(我不知道为什么)“回车+换行”的所有组合都变成了“回车+回车+换行”,(190128编辑:)例如:

以纯文本形式查看文件时,它是:

以十六进制模式查看同一文件时,它是:

出于实际目的,我需要删除双“0D”中的额外“0D”,如“
…30 30 0D 0A 30 30…”
”,并将其更改为“
…30 30 0D 0A 30…”

190129编辑:此外,为了确保我的问题可以重现,我将数据文件上传到GitHub的URL(使用前应下载并解压缩;在二进制\十六进制编辑器中,您可以
0D 0D 0A
在第一行):

我使用了下面的Perl脚本来删除额外的回车符,但令我惊讶的是,我的正则表达式根本不起作用!!我的整个代码是(190129 edit:这里是过去的整个Perl脚本):

使用警告;
严格使用;
使用File::Basename;
#-----------------------------------------------------------
#命令行处理,文件打开\创建
#-----------------------------------------------------------
#从命令行捕获输入文件名:
我的$input\u fn=$ARGV[0]或
die“应在命令行中提供输入文件名!\n”;
#解析输入文件名,并生成输出文件名:
my($iname,$ipath,$isuffix)=文件解析($input\u fn,qr/\.[^.]*/);
我的$output\u fn=$iname.“\u prunenonnotrepaitable”。$isuffix;
#打开输入文件:
打开(我的$FIN,“,$output\u fn)或关闭“创建文件错误$!\n”;
#-----------------------------------------------------------
#读取输入文件、搜索和替换、写入输出
#-----------------------------------------------------------
#一次性阅读所有行:
$/=未定义;
#将整个文件读入变量:
我的$prune_txt=;
#是否匹配并替换:
$prune_txt=~s/\x0D\x0D/\x0D/g;#不工作。
#$prune_txt=~s/\x0d\x0d/\x30/g;#不工作。
#$prune_txt=~s/\x30\x0d/\x0d/g;#我可以工作。
#$prune_txt=~s/\x0d\x0d\x0a/\x0d\x0a/gs;#不工作。
#打印结束处理时间:
打印$FO$prune_txt;
#关闭文件:
收盘价($FIN);
收盘价($FO);

我尽我所能匹配连续两次回车,但都失败了。谁能指出我的错误,或者告诉我正确的方法?提前谢谢

您的第一个正则表达式对我来说似乎工作正常,这意味着其他代码中可能存在问题。请提供一个,这意味着包括样本输入数据等

$ perl -wMstrict -e 'print "Foo\r\r\nBar\r\r\n"' >test.txt
$ hexdump -C test.txt 
00000000  46 6f 6f 0d 0d 0a 42 61  72 0d 0d 0a              |Foo...Bar...|
0000000c
$ cat test.pl 
#!/usr/bin/env perl
use warnings;
use strict;
use Data::Dump;

my $filename = 'test.txt';
open my $fh, '<:raw:encoding(ASCII)', $filename or die "$filename: $!";
my $prune_txt = do { local $/; <$fh> }; # slurp file
close $fh;

dd $prune_txt;
$prune_txt =~ s/\x0D\x0D/\x0D/g;
dd $prune_txt;

$ perl test.pl
"Foo\r\r\nBar\r\r\n"
"Foo\r\nBar\r\n"
$perl-wMstrict-e'print“Foo\r\r\nBar\r\n”>test.txt
$hextump-C test.txt
00000000 46 6f 6f 0d 0d 0a 42 61 72 0d 0d 0a | Foo…Bar|
0000000摄氏度
$cat test.pl
#!/usr/bin/env perl
使用警告;
严格使用;
使用数据::转储;
我的$filename='test.txt';

在Windows上打开我的$fh,“,默认情况下,文件句柄有一个
:crlf

  • 该层在读取时将CR LF转换为LF
  • 该层在写入时将LF转换为CR LF
解决方案1:补偿
:crlf
层。

如果希望以系统适当的行尾结束,则可以使用此解决方案

# ... read ...      # CR CR LF ⇒ CR LF
s/\r+\n/\n/g;       # CR LF    ⇒ LF
# ... write ...     # LF       ⇒ CR LF
解决方案2:删除
:crlf
层。

如果你想无条件地得到CR LF,你应该使用这个解决方案

使用
:raw
而不是
作为模式

# ... read ...      # CR CR LF ⇒ CR CR LF
s/\r*\n/\r\n/g;     # CR CR LF ⇒ CR LF
# ... write ...     # CR LF    ⇒ CR LF

为什么您认为有两个相邻的回车符?将
[\r\n]+
替换为
\r\n
,如图所示。这是@zdim,当我以二进制格式查看文件时,我可以看到两个回车符。大概你保存了编辑过的文本?您是否以二进制模式访问输入/输出文件?我确实保存了编辑的文本;此外,当我尝试匹配其他关键字时,它确实有效。谢谢你的回复!根据您的建议,我已经更新了我的帖子,将我的整个Perl脚本放在其中,并添加了一个指向原始数据文件的URL,以确保我的问题可以重现。我的数据文件是在Windows上创建的,我的Perl也在Windows上运行,这是否意味着它们都是“Windows编码”?@katyusza感谢更新。看起来您没有打开带有
:raw
层的文件,这将删除自动添加到Windows上的
:crlf
,这就是我的代码在我这方面起作用的原因。我很确定使用
巴迪谢谢你的进一步跟进!我不知道Windows会在不让我知道的情况下自动在我的文件中添加内容,现在我知道:)我的问题现在解决了,谢谢你仔细的解释@katyusza很乐意帮忙。为了确保清楚,这并不完全是Windows的错,我所说的“
:crlf
”指的是Perl的I/O层,Perl在Windows上自动使用该层,试图帮助您在Windows上读写带有crlf行结尾的文本文件。有关详细信息,请参阅和。感谢您的帮助!你的帖子澄清了我对文件格式的误解,解决了我的问题!再次感谢!
# ... read ...      # CR CR LF ⇒ CR CR LF
s/\r*\n/\r\n/g;     # CR CR LF ⇒ CR LF
# ... write ...     # CR LF    ⇒ CR LF