Как сделать это на PowerShell?

Всем привет! Нужна помощь в переписывании однострочного скрипта. :)

#!/bin/bash

grep -vwE "ДнейОтсрочки" "Doc_2020-01.xml" > 01_new.xml

Этот скрипт ищет в файле Doc_2020-01.xml строку "ДнейОтсрочки" и удаляет её (удаляется полностью строка файла, а не только искомое вхождение).

Результат записывается (выводится) в файл 01_new.xml Особенность: искомая строка и xml-файл в кодировке UTF-8


Ответы (2 шт):

Автор решения: PotroNik

Примерно так будет выглядеть команда:

Select-String -NotMatch 'ДнейОтсрочки' 'E:\Doc_2020-01.xml' | Set-Content 'e:\01_new.xml'

Select-String - аналог grep
-NoMatch - аналог -v
Set-Content записывает stdout в файл

→ Ссылка
Автор решения: user7860670

Да почти также, только вместо grep Select-String. Основное отличие в том, что пайпы в Powershell передают объекты, а не просто байты, и по-умолчанию Select-String выдает объекты класса Microsoft.PowerShell.Commands.MatchInfo. Чтобы он начал выдавать просто строчки необходимо добавить параметр -Raw

Select-String -NotMatch -Pattern "ДнейОтсрочки" -Path "./Doc_2020-01.xml" -Raw > "./01_new.xml"

В версиях Powershell до 7 параметра -Raw не было, и там было бы необходимо дополнительно обработать выхлоп, оставив только строки:

Select-String -NotMatch -Pattern "ДнейОтсрочки" -Path "./Doc_2020-01.xml" | ForEach-Object { $_.Line } > "./01_new.xml"
→ Ссылка