我正在尝试使用Perl的就地编辑功能在Windows上的PowerShell会话中更改带有Unix行结尾的文件中的一些文本:
perl.exe -i'.bak' -p -e "s#PATTERN#REPLACEMENT#g" (get-childItem *.sql,*/*.sql)
不幸的是,行尾从Unix更改为Windows。
是否有选项可以调整此一行,使其不会修改行尾?
通常,在Windows上,默认情况下使用:crlf
PerlIO层,它将文件中的CRLF行尾转换为perl
看到的字符串中的LF。传统上,:raw
PerlIO 层将用于防止这种情况,但根据文档:
如果您希望 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)