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

发布于 2025-01-11 07:52:30 字数 252 浏览 0 评论 0原文

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

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

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

是否有一个选项可以调整这个衬线,使其不会修改行结尾?

I am trying to use Perl's in-place-editing feature to change some text in files with Unix line endings in a PowerShell session on Windows:

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

Unfortunately, the line endings are changed from Unix to Windows.

Is there an option to tweak this one liner so that it doesn't modify the line endings?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

み格子的夏天 2025-01-18 07:52:30

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

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

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

在我的测试中(使用 Strawberry Perl 5.32),尽管有上述情况,使用 :perlio 和该编译指示仍然会进行行结束转换,所以 :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)

Normally, on Windows, the :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.

You can use the open pragma to change the default layers for opening files (And/or use the three argument version of open to customize them on a per-file basis).

In my testing (using Strawberry Perl 5.32), using :perlio with that pragma still did line ending conversion despite the above, so :raw it is. (However, perlio works with the PERLIO environment variable. It looks like when set that way it replaces the default layers, when used with the pragma it appends to the defaults instead despite what the documentation suggests.)

So,

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

or

PS> $env:PERLIO="perlio"
PS> perl.exe -i'.bak' -p -e "s#PATTERN#REPLACEMENT#g" (get-childItem *.sql,*/*.sql)
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文