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

How can I use Perl for in-place-editing of files with Unix-EOL on Windows?

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

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

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

是否可以选择调整这一行使其不修改行尾?

通常,Windows,:crlf PerlIO layer is used by default, which converts to and from CRLF line endings in the file to LF in the strings perl sees. Traditionally, the :raw PerlIO layer would be used to prevent this, but according to the documentation

If you want UNIX line endings on a platform that normally does CRLF translation, but still want UTF-8 or encoding defaults, the appropriate thing to do is to add :perlio to the PERLIO environment variable, or open the handle explicitly with that layer, to replace the platform default of :crlf.

您可以使用 open pragma 更改打开文件的默认图层(And/or 使用 open 的三参数版本在 per-file 的基础上自定义它们).

在我的测试中(使用 Strawberry Perl 5.32),使用 :perlio 和该 pragma 仍然进行行结束转换,所以 :raw 是。 (但是,perlioPERLIO 环境变量一起使用。看起来像这样设置时它会替换默认层,当与 pragma 一起使用时它会附加到默认值而不是尽管文档建议。)

所以,

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)