gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 11:23:22 24 4
gpt4 key购买 nike

嗨,StackOverflow 的 friend 们,

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

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

Text file in plain text (with unprintable stuffs)

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

Text file in hex mode, can see the double "0D"s

出于实际目的,我需要删除双“0D”中多余的“0D”,例如“.... 30 30 0D 0D 0A 30 30 ....”,并将其更改为“.... 30 30 0D 0A 30 30 ....”。

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

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

use warnings            ;
use strict ;
use File::Basename ;

#-----------------------------------------------------------
# command line handling, file open \ create
#-----------------------------------------------------------

# Capture input input filename from command line:
my $input_fn = $ARGV[0] or
die "Should provide input file name at command line!\n";

# Parse input file name, and generate output file name:
my ($iname, $ipath, $isuffix) = fileparse($input_fn, qr/\.[^.]*/);
my $output_fn = $iname."_pruneNonPrintable".$isuffix;

# Open input file:
open (my $FIN, "<", $input_fn) or die "Open file error $!\n";

# Create output file:
open (my $FO, ">", $output_fn) or die "Create file error $!\n";


#-----------------------------------------------------------
# Read input file, search & replace, write to output
#-----------------------------------------------------------

# Read all lines in one go:
$/ = undef;

# Read entire file into variable:
my $prune_txt = <$FIN> ;

# Do match & replace:
$prune_txt =~ s/\x0D\x0D/\x0D/g; # do NOT work.
# $prune_txt =~ s/\x0d\x0d/\x30/g; # do NOT work.
# $prune_txt =~ s/\x30\x0d/\x0d/g; # can work.
# $prune_txt =~ s/\x0d\x0d\x0a/\x0d\x0a/gs; # do NOT work.

# Print end time of processing:
print $FO $prune_txt ;

# Close files:
close($FIN) ;
close($FO) ;

我尽我所能来匹配两个连续的回车,但失败了。任何人都可以指出我的错误,或者告诉我正确的方法吗?提前致谢!

最佳答案

在 Windows 上,文件句柄有一个 :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>:raw而不是 <>作为模式。

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

关于regex - 在Perl中,如何匹配两个连续的回车符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54396278/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com