如何在电源外壳中的多条线之间进行选择?

时间:2018-11-20 13:18:15

标签: powershell

我在这里使用Get-Content(gc)。我需要删除由开始和结束标记定义的一组行。但是由于某些原因,我使用的命令不起作用。你知道我在这里想念吗?

我尝试过的命令:

powershell -Command ((gc test.txt) -replace '"/\#start.*\#end/gms"','')

test.txt:

line1
line2
#start
line3
line4
#end
line5

预期输出:

line1
line2
line5

2 个答案:

答案 0 :(得分:3)

Get-Content将文件读入字符串数组。使用Get-Content -Raw将其读取为一个字符串。

powershell -Command ((Get-Content -Path test.txt -Raw) -replace '(?smi)#start(.*)#end\r?\n','')

答案 1 :(得分:2)

@TobyU回答,使用-Raw可以轻松解决问题,但是这种快速解决方案有一个缺点:

PowerShell在流对象方面非常出色,这就是Get-Content首先提供行流的原因。如果使用-Raw和/或括号,则会阻塞输出管道。对于较小的列表来说,这不是一个大问题,但是当列表变大时,可能会导致性能问题和/或内存问题。

关于PowerShell流传输管道,您可以考虑通过以下方式解决它:

$On = $True; Get-Content -Path test.txt | Where {If ($_ -eq '#start') {$On = $False} ElseIf ($_ -eq '#end') {$On = $True} Else {$On}}

在此命令中,Where过滤#Start#End,因为在两种情况下它们都没有任何输出,而当$on为{ {1}}。