我使用的是Windows 10和Strawberry Perl
众所周知,Linux中的行终止符是\n,而Windows中的行终止符是\r\n。
我发现,在我的电脑上,Linux类型的文件会自动转换为windows类型的\r\n
perl -i.bak -pe "s/aaa/bbb/g" test.txt但这不是我想要的,而且似乎不合理。我想知道这是一个草莓Perl问题,还是另一个因素?
如何在Windows上保留行终止符不受影响?
发布于 2017-09-09 19:56:03
这是Windows上Perl的标准行为(将\n转换为\r\n)。
您可以通过使用binmode来解决这个问题,它阻止Perl执行自动的行尾转换。
然后,您的命令将更改为如下所示。它告诉binmode写入STDOUT,然后输出必须重定向到另一个文件。下面的命令应该可以执行您想要的操作(尽管不在适当的位置):
perl -pe "BEGIN{ binmode(STDOUT) } s/aaa/bbb/g" test.txt > newtest.txt发布于 2017-09-09 22:26:25
“实际上,我将unix格式设置为notepad++默认格式,这是我的主编辑器。”我认为您应该努力为适当的系统保留具有正确行尾的文件。如果到处都放着Linux文件,你不会交到任何朋友,因为这会使其他人很难使用你的非标准方法
正确地使用这两个系统并不是很困难,因为您所要做的就是在从一个系统复制到另一个系统时自动进行更改。您可以在制作副本时使用dos2unix和unix2dos,但是编写一个Perl程序来使用相关版本的文本文件更新所有系统将是一项简单的工作
然而,如果你坚持这个计划,这应该会帮助你实现它。
默认情况下,当在Windows上运行时,perl将使用IO层:unix和:crlf,这意味着它的工作方式与Linux系统上相同,但它将在输入时将CRLF转换为LF,在输出时将LF转换为CRLF。
您可以通过添加一个显式的伪层:raw来使各个:crlf调用的行为有所不同,这将删除:crlf层。但是如果您想修改特殊的文件句柄STDIN、STDOUT和ARGV,那么您需要一个不同的策略,因为这些句柄是由perl为您打开的。
您可以在程序的顶部使用open杂注,如下所示
use open IO => ':raw';它将隐式地将:raw层应用于每个输入或输出文件句柄,包括特殊句柄。您可以在命令行中使用以下命令设置此设置
perl -Mopen=IO,raw program.pl或者您可以设置PERLIO环境变量
set PERLIO=raw这将影响从今以后从同一cmd窗口运行的每个程序。
https://stackoverflow.com/questions/46130170
复制相似问题