字符串和 here 文档在 Windows 上具有 UNIX 行结尾

Strings and here document have UNIX line endings on Windows

提问人:lit 提问时间:10/10/2023 最后编辑:mklement0lit 更新时间:10/10/2023 访问量:64

问:

这里的文档和字符串都在 Windows 上使用 UNIX 0x0A行尾而不是0x0D0A。如何让它们成为 Windows 行结尾?

PS C:\> $s = @"
>> now
>> is
>> the
>> "@
PS C:\> $s
now
is
the
PS C:\> $s | Format-Hex

   Label: String (System.String) <7B93DCA4>

          Offset Bytes                                           Ascii
                 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
          ------ ----------------------------------------------- -----
0000000000000000 6E 6F 77 0A 69 73 0A 74 68 65                   now�is�the

PS C:\> $s2 = "
>> Now
>> is
>> the
>> "
PS C:\> $s2

Now
is
the

PS C:\> $s2 | Format-Hex

   Label: String (System.String) <33E42D9F>

          Offset Bytes                                           Ascii
                 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
          ------ ----------------------------------------------- -----
0000000000000000 0A 4E 6F 77 0A 69 73 0A 74 68 65 0A             �Now�is�the�

PS C:\> $PSVersionTable.PSVersion.ToString()
7.3.7
PowerShell 文本 多行字符串 herestring

评论

2赞 Santiago Squarzon 10/10/2023
-replace '(?<!\r)\n', "`r`n".另外,在似乎之前有人问过:stackoverflow.com/questions/54129708/......

答:

0赞 zoey-stack-overflow-edition 10/10/2023 #1

有 2 种方法可以做到这一点:

您可以使用 dos2unix

或者,您可以使用正则表达式。

有多种正则表达式语法,但对于 powershell 来说,它只是-replace '(?<!\r)\n', "`r`n"

评论

2赞 lit 10/10/2023
Zoey,我认为在不安装其他套件的情况下,Windows 和 PowerShell 上没有。此外,替换字符串可能不应使用 REVERSE SOLIDUS(反斜杠)字符。dos2unix
1赞 lit 10/10/2023 #2

我认为通常的目标是使用当前特定于平台的换行符序列。为了实现这一点,我想我将使用:

-replace '(?<!\r)\n', [Environment]::NewLine

这似乎适用于 Windows、wsl 和 Ubuntu。

2赞 mklement0 10/10/2023 #3

您自己的解决方案可能是最佳方法,因为它可确保在所有支持的平台上使用适合平台的换行符格式。

请允许我补充一下背景资料

在 PowerShell 中定义多行字符串文本常规字符串文本及其 here-string 变体)时:

  • 在脚本文件 (, ) 中,PowerShell 使用封闭文件相同的换行符格式.ps1.psm1

  • 在所有受支持的平台上,PowerShell 始终以交互方式(也许令人惊讶)使用仅限 LF 的换行符(在 PowerShell 中)。"`n"

换言之,用于脚本

  • 如果需要多行字符串文本中的 CRLF(Windows 格式)或仅 LF(Unix 格式)换行符,请以该格式保存脚本文件"`r`n""`n"

  • 对于跨平台脚本,请使用解决方案。-replace

    • 这在实践中几乎无关紧要,但如果你想避免不必要的替换,你可以使用以下方法:
      • 使用仅限 LF 的换行符保存脚本。

      • 仅在必要时执行替换,然后可以通过以下方式进行字面替换:.Replace()

        if ($env:OS -eq 'Windows_NT') { 
          $multiLineStr = $multiLineStr.Replace("`n", "`r`n") 
        }