提问人:lit 提问时间:10/10/2023 最后编辑:mklement0lit 更新时间:10/10/2023 访问量:64
字符串和 here 文档在 Windows 上具有 UNIX 行结尾
Strings and here document have UNIX line endings on Windows
问:
这里的文档和字符串都在 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
答:
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") }
- 这在实践中几乎无关紧要,但如果你想避免不必要的替换,你可以使用以下方法:
评论
-replace '(?<!\r)\n', "`r`n"
.另外,在似乎之前有人问过:stackoverflow.com/questions/54129708/......