Как выбрать между несколькими линиями в Power Shell? - PullRequest
0 голосов
/ 20 ноября 2018

Я использую 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 голосов
/ 20 ноября 2018

Как ответил @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 равен $True.

0 голосов
/ 20 ноября 2018

Get-Content считывает файл в массив строк.Используйте Get-Content -Raw, чтобы прочитать его как одну строку.

powershell -Command ((Get-Content -Path test.txt -Raw) -replace '(?smi)#start(.*)#end\r?\n','')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...