PowerShell 技能连载 - 分割文本行(第 3 部分)

在上一个技能中,我们将一大块多行文本拆分为单独的行,并删除了所有空行。

然而,当一行不是真正的空,而是包含空格(空格或制表符)时,它仍然会被输出:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# $data is a single string and contains blank lines
$data = @'

Server1


Server2
Cluster4


'@

$data = $data.Trim()

# split in single lines and remove empty lines
$regex = '[\r\n]{1,}'
$array = $data -split $regex

$array.Count

$c = 0
Foreach ($_ in $array)
{
'{0:d2} {1}' -f $c, $_
$c++
}

在这里,我们在 “Server2” 正上方的行中添加了几个空格(当然,在列表中看不到)。以下是执行结果:

00 Server1
01
02 Server2
03 Cluster4

由于我们要在任意数量的 CR 和 LF 字符处拆分,因此空格会破坏该模式。

与其将正则表达式变成一个更复杂的野兽,不如为这些事情附加一个简单的 Where-Object 来进行精细修饰:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# $data is a single string and contains blank lines
$data = @'

Server1


Server2
Cluster4


'@

$data = $data.Trim()

# split in single lines and remove empty lines
$regex = '[\r\n]{1,}'
$array = $data -split $regex |
Where-Object { [string]::IsNullOrWhiteSpace($_) -eq $false }

$array.Count

$c = 0
Foreach ($_ in $array)
{
'{0:d2} {1}' -f $c, $_
$c++
}

[string]::IsNullOrEmpty() 代表我们所追求的情况,因此符合条件的行被 Where-Object 删除。结果就是所需要的理想结果:

00 Server1
01 Server2
02 Cluster4

PowerShell 技能连载 - 分割文本行(第 3 部分)

http://blog.vichamp.com/2021/10/08/turning-text-into-individual-lines-part-3/

作者

吴波

发布于

2021-10-08

更新于

2022-07-06

许可协议

评论