如何使用Perl在Windows上使用Unix-EOL就地编辑文件?



我正在尝试使用Perl的就地编辑功能在Windows上的PowerShell会话中更改带有Unix行结尾的文件中的一些文本:

perl.exe -i'.bak' -p -e "s#PATTERN#REPLACEMENT#g" (get-childItem *.sql,*/*.sql)

不幸的是,行尾从Unix更改为Windows。

是否有选项可以调整此一行,使其不会修改行尾?

通常,在Windows上,默认情况下使用:crlfPerlIO层,它将文件中的CRLF行尾转换为perl看到的字符串中的LF。传统上,:rawPerlIO 层将用于防止这种情况,但根据文档:

如果您希望 UNIX 行结尾位于通常执行 CRLF 转换的平台上,但仍需要 UTF-8 或编码默认值,则适当的做法是将:perlio添加到 PERLIO 环境变量,或使用该层显式打开句柄,以替换平台默认值:crlf

您可以使用open杂注更改用于打开文件的默认图层(和/或使用open的三参数版本基于每个文件自定义它们)。

在我的测试中(使用 Strawberry Perl 5.32),尽管有上述情况,但使用该编译指示的:perlio仍然会进行行结束转换,所以:raw如此。(但是,perlio适用于PERLIO环境变量。看起来当以这种方式设置时,它会替换默认层,当与杂注一起使用时,它会附加到默认值,尽管文档建议。

所以

PS> perl.exe -Mopen="IO,:raw" -i'.bak' -p -e "s#PATTERN#REPLACEMENT#g" (get-childItem *.sql,*/*.sql)

PS> $env:PERLIO="perlio"
PS> perl.exe -i'.bak' -p -e "s#PATTERN#REPLACEMENT#g" (get-childItem *.sql,*/*.sql)

相关内容

  • 没有找到相关文章

最新更新