如何防止perl替换仅使用unix的换行?

时间:2013-07-24 09:12:20

标签: perl batch-file activeperl

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

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

脚本在Windows机器上执行。

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

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

更新@ amon:

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

2 个答案:

答案 0 :(得分:2)

来自PerlIO文档:

  

:CRLF

     

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

     

就Control-Z作为文件结束标记而言,它目前不能模仿MS-DOS。

因此在输出时,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 pragma为我做这件事。

答案 1 :(得分:1)

简单地管道到tr

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

tr下载:GNUWin32UnxUtils Updates