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