Прочитать файл Powershell, найти шаблон Удалить шаблон, записать в тот же или новый файл - PullRequest
0 голосов
/ 09 июня 2018

Я крайне новичок в Powershell, и у меня есть задача, которую мне нужно выполнить на работе над проектом.Здесь вопрос.У меня есть несколько файлов, но как только код работает для одного, я могу запустить их как пакет.
Содержимое файла выглядит следующим образом:

AAA0000XYZZ
BBB0001H0351
CXXXXX  ABCUABSS    22/11/1990
YYY0001H035100001
ZZZ0000XYZZ

Это код, который я написал до сих пор

$pattern = "BBB*H0351(.*?)YYY*H0351"
PS F:\Practice_Codes> $data = get-content PS1.txt
PS F:\Practice_Codes> $Result = $Data -replace $pattern,""
PS F:\Practice_Codes> $Result 

Код не выдает никаких ошибок, но и не заменяет шаблон из текста.Любая помощь будет принята с благодарностью.Заранее спасибо.Еще немного подробностей, если это требуется.Версия Powershell

PSVersion                      5.1.16299.431
PSEdition                      Desktop
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0...}
BuildVersion                   10.0.16299.431
CLRVersion                     4.0.30319.42000
WSManStackVersion              3.0
PSRemotingProtocolVersion      2.3
SerializationVersion           1.1.0.1

1 Ответ

0 голосов
/ 10 июня 2018

Я могу только догадываться, что вы ищете.
См. Объяснение REgEx, используемого на https://regex101.com/r/qen2VS/1

В связи с растущими требованиями нам нужен лучший сингл RegEx
который использует чередование и обратная ссылка

## Q:\Test\2018\06\10\SO_50777935.ps1
$Text=@"
AAA0000XYZZ
BBB0001H0351
CXXXXX  ABCUABSS    22/11/1990
YYY0001H03510000001
ZZZ0000XYZZ
AAA0001XYZZ
BBB0001H9561
CXXXXX  ABCUABSS    22/11/1990
YYY0001H95610000001
ZZZ0001XYZZ
"@

$Pattern ="(?s)BBB\d+(H0351|H9561).*?YYY\d+\1\d+\r?\n"

$text -replace $pattern

AAA0000XYZZ
ZZZ0000XYZZ
AAA0001XYZZ
ZZZ0001XYZZ

В одной строке (?S) = изменяется поведение RegEx, чтобы также соответствовать cr / lf
Чередование (H0351|H9561) соответствует либо H0351, либо H9561
Обратная ссылка \1 снова соответствует результату, найденному с (H0351|H9561)

Сценарий, заменяющий шаблон во всех * .txt файлах в текущей папке:

$Pattern ="(?s)BBB\d+(H0351|H9561).*?YYY\d+\1\d+\r?\n"
ForEach($File in (Get-ChildItem *.txt -File)){
    (Get-Content $File -Raw) -Replace $Pattern | Set-Content $File
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...