1

我有一个小例程,我在文件上应用一些正则表达式并将整个内容写入一个新文件。

perl -p -e "myRegexReplace" %INPUT% >%OUTPUT%

该脚本在 Windows 机器上执行。

出于测试目的,我有一个仅包含 Unix Linebreaks 的文件LF。但是,在处理文件后,换行符是CRLF格式。

如何防止 perl 更改换行格式?

更新@阿蒙:

STDIN :unix
STDIN :crlf
STDOUT :unix
STDOUT :crlf
4

2 回答 2

2

从 PerlIO 文档:

:crlf

一个实现 DOS/Windows 的层,如 CRLF 行尾。读取时将 CR、LF 对转换为单个“\n”换行符。写入时将每个 "\n" 转换为 CR,LF 对。请注意,该层将默默地拒绝被推到自身之上。

它目前不模仿 MS-DOS 将 Control-Z 视为文件结束标记。

所以在输出时,LF 被转换为不需要的 CRLF。

要删除这一层,我们希望获得原始文件句柄而不需要字节咀嚼。此脚本演示如何使用binmode更改图层:

use feature 'say';

print_layers();

# remove any byte-munching layers (:crlf, :utf8)
# this would also be a nice place to add `:utf8` or some `:encoding(...)`
binmode $_, ":raw" for STDIN, STDOUT, STDERR;

print_layers();

sub print_layers {
  say "== Layers ==";
  for my $fh (STDIN, STDOUT, STDERR) {
    say "$fh :$_" for PerlIO->get_layers($fh);
  }
}

输出应该是:

== Layers ==
STDIN :unix
STDIN :crlf
STDOUT :unix
STDOUT :crlf
STDERR :unix
STDERR :crlf
== Layers ==
STDIN :unix
STDOUT :unix
STDERR :unix

我不知道如何说服open编译指示为我做这件事。

于 2013-07-24T12:00:02.360 回答
1

只需管道到tr

perl -p -e "myRegexReplace" %INPUT% | tr -d \r >%OUTPUT%

tr 下载:GNUWin32UnxUtils 更新

于 2013-07-24T13:04:47.153 回答