我知道在Windows和Unix系统中有不同的换行符代码。但是在PowerShell中,`r`n
和`n
都可用于换行。
是否存在从`n
自动转换为`r`n
的功能,以及为什么必须使用引号而不是反斜杠?
我知道在Windows和Unix系统中有不同的换行符代码。但是在PowerShell中,`r`n
和`n
都可用于换行。
是否存在从`n
自动转换为`r`n
的功能,以及为什么必须使用引号而不是反斜杠?
在输入时,PowerShell接受`r`n
(Windows风格)和`n
(Unix风格)以及换行符可互换使用,无论运行平台(操作系统)如何;这适用于读取PowerShell源代码文件(例如*.ps1
脚本)和所有读取文本的内置cmdlet,特别是Get-Content
。
`n
是LF,即LINE FEED,U+000A
字符,在类Unix平台上作为单独的换行符使用。
`r`n
是CRLF,由CARRIAGE RETURN(U+000D
)字符紧随其后的LF组成的换行序列,在Windows上作为换行符使用。
以上使用`
,因为它是`
,即反引号(正式称为GRAVE ACCENT,U+0060
),在PowerShell中充当转义字符,而不像许多其他语言中那样是\
(例如,PowerShell中的`n
对应于C#和JavaScript中的\n
,`r`n
对应于\r\n
)。
`
在PowerShell中充当转义字符:
请注意,在正则表达式上下文中(例如通过-match
和-replace
运算符),\
为基础的转义序列(例如\n
)仍然可能起作用,即当这些转义序列由.NET正则表达式引擎而不是PowerShell本身解释时(例如,"a`nb" -replace '\n'
产生'ab'
);请参阅有关正则表达式的概念帮助主题。
在输出时,PowerShell使用平台本机换行符序列:Windows上为`r`n
,类Unix平台上为`n
。
这适用于使用创建文本文件的cmdlet,包括:
Set-Content
和Out-File
/ 重定向运算符&
关于您的具体问题:
`n
自动转换为`r`n
吗?
从某种意义上说,是的:
使用创建文本文件的命令时,将文件保存到文件中会隐式地使用平台本地的换行序列,如上所述。
因此,使用Get-Content
(默认按行读取文件)读取文件,并使用Set-Content
将这些行保存回文件,如果原始换行符来自相应的其他世界,则有效地将原始换行符转换为平台本地换行符。
请注意,另外,字符编码可能会更改,因为一旦字符串被读入内存,输入文件的字符编码信息就会丢失,而像Set-Content
这样的文本文件创建命令会在输出时应用它们的默认编码 - 有关背景信息,请参见this answer。
针对特定的换行样式进行转换,而不考虑您正在运行的平台,需要更多的工作。
- 请参见this answer。
为什么要使用反引号(`
)而不是反斜杠(\
)?
在PowerShell中,使用\
作为转义字符是不明智的选择,因为\
用于文件路径,考虑到\
在Windows上作为(主要的)文件系统路径分隔符,传递文件路径作为参数是shell中非常常见的用例。
必须对这些路径分隔符进行\
转义,以将其与作为转义字符的\
区分开来(例如,使用"C:\\Program Files\\PowerShell"
而不是"C:\Program Files\PowerShell"
)会增加很大负担(尽管在编程语言(如C#和JavaScript)中这种转义已经够烦人了,但最近的版本现在提供了替代语法形式,不需要转义)。
因此,PowerShell 需要一个不同的转义字符,并选择了 `
,原因如下:
在字面使用时 很少出现;也就是说,你很少需要像编程语言中那样将 `
作为转义字符 - 如 ``
。
至少在英语键盘上,它很容易输入。
其他 shell:
cmd.exe
也必须选择不同的转义字符,并选择了 ^
,即插入符号(CIRCUMFLEX ACCENT,U+005E
)。
类似于 Bash 的 POSIX shell 从未遇到这个问题,因为在 Unix 文件系统路径中,分隔符是 /
而不是 \
,因此这些 shell 使用 \
作为转义字符,与大多数编程语言相同。
\n
和 \r\n
的行尾序列等同地解释。而 \r\n
行尾序列大多是过去 Windows 的产物,现代(约 2018 年)的大多数 Windows 应用程序都会将它们解释为相同的内容。Get-Content
。
虽然越来越普遍的是应用程序可以使用任何序列读取文件,但它们通常会使用平台本地的序列进行写入(尤其是 PowerShell 和 .NET API 在 Windows 上使用 CRLF 序列),这种情况不会很快消失,甚至永远不会消失。
因此,这不是过去的产物。 - mklement0当使用get-content(不带-raw)将文件读入字符串数组时,根本没有行尾。然后,out-file(“>”)或set-content将根据操作系统放置行尾。Mac OS以前只有`r,但现在就像unix一样,都是`n。
这是一个在osx中只有`n(0x0A)的文件:
format-hex file
Label: /Users/js/foo/file
Offset Bytes Ascii
00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
------ ----------------------------------------------- -----
0000000000000000 61 62 63 0A 61 62 63 0A abc�abc�
我在这里有一篇关于格式转换的帖子: 将Unix换行符转换为Windows换行符(在Windows上)