我在这里使用Get-Content(gc)。我需要删除由开始和结束标记定义的一组行。但是由于某些原因,我使用的命令不起作用。你知道我在这里想念吗?
我尝试过的命令:
powershell -Command ((gc test.txt) -replace '"/\#start.*\#end/gms"','')
test.txt:
line1
line2
#start
line3
line4
#end
line5
预期输出:
line1
line2
line5
答案 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}}。