首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在Windows上防止将\n转换为\r\n

如何在Windows上防止将\n转换为\r\n
EN

Stack Overflow用户
提问于 2017-09-09 19:28:14
回答 2查看 784关注 0票数 2

我使用的是Windows 10和Strawberry Perl

众所周知,Linux中的行终止符是\n,而Windows中的行终止符是\r\n

我发现,在我的电脑上,Linux类型的文件会自动转换为windows类型的\r\n

代码语言:javascript
运行
复制
perl -i.bak -pe "s/aaa/bbb/g" test.txt

但这不是我想要的,而且似乎不合理。我想知道这是一个草莓Perl问题,还是另一个因素?

如何在Windows上保留行终止符不受影响?

EN

回答 2

Stack Overflow用户

发布于 2017-09-09 19:56:03

这是Windows上Perl的标准行为(将\n转换为\r\n)。

您可以通过使用binmode来解决这个问题,它阻止Perl执行自动的行尾转换。

然后,您的命令将更改为如下所示。它告诉binmode写入STDOUT,然后输出必须重定向到另一个文件。下面的命令应该可以执行您想要的操作(尽管不在适当的位置):

代码语言:javascript
运行
复制
perl -pe "BEGIN{ binmode(STDOUT) } s/aaa/bbb/g" test.txt > newtest.txt
票数 2
EN

Stack Overflow用户

发布于 2017-09-09 22:26:25

“实际上,我将unix格式设置为notepad++默认格式,这是我的主编辑器。”我认为您应该努力为适当的系统保留具有正确行尾的文件。如果到处都放着Linux文件,你不会交到任何朋友,因为这会使其他人很难使用你的非标准方法

正确地使用这两个系统并不是很困难,因为您所要做的就是在从一个系统复制到另一个系统时自动进行更改。您可以在制作副本时使用dos2unixunix2dos,但是编写一个Perl程序来使用相关版本的文本文件更新所有系统将是一项简单的工作

然而,如果你坚持这个计划,这应该会帮助你实现它。

默认情况下,当在Windows上运行时,perl将使用IO层:unix:crlf,这意味着它的工作方式与Linux系统上相同,但它将在输入时将CRLF转换为LF,在输出时将LF转换为CRLF。

您可以通过添加一个显式的伪层:raw来使各个:crlf调用的行为有所不同,这将删除:crlf层。但是如果您想修改特殊的文件句柄STDINSTDOUTARGV,那么您需要一个不同的策略,因为这些句柄是由perl为您打开的。

您可以在程序的顶部使用open杂注,如下所示

代码语言:javascript
运行
复制
use open IO => ':raw';

它将隐式地将:raw层应用于每个输入或输出文件句柄,包括特殊句柄。您可以在命令行中使用以下命令设置此设置

代码语言:javascript
运行
复制
perl -Mopen=IO,raw program.pl

或者您可以设置PERLIO环境变量

代码语言:javascript
运行
复制
set PERLIO=raw

这将影响从今以后从同一cmd窗口运行的每个程序。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46130170

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档