如何按每个新行拆分字符串,并将每行放入PowerShell中的单独数组条目中

时间:2017-09-18 01:19:35

标签: arrays powershell

我的问题非常简单,我对PowerShell很新,但我只是想知道是否有一种简单的方法可以按行分割字符串,并将每行的内容添加到单独的数组条目中。

2 个答案:

答案 0 :(得分:3)

PowerShell的帮助系统包含许多有用的信息(类型help以便开始使用。)

使用-split运算符拆分字符串。 PowerShell使用反引号字符(`)表示转义码,因此它看起来像这样:

$str -split "`n"

例如,我们可以定义一个字符串并在该字符串上调用Length以获取长度(以字符为单位):

PS C:\> $str = "One`nTwo`nThree"

PS C:\> $str
One
Two
Three

PS C:\> $str.Length
13

现在我们将创建一个数组,其中该字符串被分成行并获得结果数组的长度。请注意,在PowerShell中,每行显示一个项目,因此它的显示方式与此前的结果类似!

PS C:\> $arr = $str -split "`n"

PS C:\> $arr
One
Two
Three

PS C:\> $arr.Length
3

PowerShell最初可能会令人困惑。一个技巧是将数据结构转换为JSON,看看在你习惯它之前会发生什么。

PS C:\> $str | ConvertTo-Json -Compress
"One\nTwo\nThree"

PS C:\> $arr | ConvertTo-Json -Compress
["One","Two","Three"]

答案 1 :(得分:2)

补充Don Cruickshank's helpful answer

"`n"扩展为仅 LF字符 Unix -style ,Unicode代码点U+000A),但您的输入可能会使用 CRLF序列"`r`n" Windows -style ,Unicode代码点U+000D和{{ 1}})作为换行符(换行符)

虽然给定平台的本机换行符[sequence]反映在U+000A中,但无法保证给定输入(文件)的换行使用它。

值得注意的是,脚本嵌入在这里 - 字符串(例如,[Environment]::Newline)使用保存封闭脚本文件的任何换行格式 - 当读取脚本执行时,PowerShell接受两者 LF - 仅支持所有平台上的CRLF文件。

因此,通过换行将字符串拆分为行的最健壮的形式是以下习语,它利用了@"<newline>...<newline>"@运算符默认接受的事实正则表达式作为分割标准:

-split

以上处理输入正确地仅包含LF( $str -split '\r?\n' # returns array of lines contained in $str )和CRLF(\n)换行符,
因为\r\n匹配每个\r?\n(LF)可选(\n)前面有?(CR)。