Powershell - MultiLine Regex расщепление - PullRequest
2 голосов
/ 15 апреля 2020

То, что я пытаюсь сделать, это взять блок скрипта sql и убрать операторы 'GO'.

Я думаю, что я создал правильное регулярное выражение; (?smi)(.*?)^GO$; как это выглядит здесь: https://regex101.com/r/Mg58zl/1

Ниже приведено то, что у меня сейчас есть для сценария powershell; но я не получаю ожидаемых результатов. Я, кажется, получаю одно большое совпадение на всем входе; а не 2 матча; каждый из которых представляет оператор в пределах разделителей GO. Любые идеи о том, что я здесь не так?

#$fileContent = [io.file]::ReadAllText("C:\temp\script.sql")
$fileContent = @"
GO
    IF NOT EXISTS  (select 1 
                from INFORMATION_SCHEMA.COLUMNS
                WHERE TABLE_NAME = 'MyTable' 
                and COLUMN_NAME = 'NewColumn')   
        BEGIN
            ALTER TABLE MyTable 
            ADD NewColumn bit not null DEFAULT(0)
        END
go
    IF NOT EXISTS  (select 1 
                from INFORMATION_SCHEMA.COLUMNS
                WHERE TABLE_NAME = 'AnotherTable' 
                and COLUMN_NAME = 'AnotherNewColumn')   
        BEGIN
            ALTER TABLE AnotherTable 
            ADD AnotherNewColumn bit not null DEFAULT(0)
        END
GO
"@
$matchInfo = $fileContent | Select-String '(?smi)(^.*?)^GO$' -AllMatches

Ответы [ 2 ]

1 голос
/ 15 апреля 2020

Обратите внимание, что (?m)GO$ будет соответствовать GO только в конце строки или в строке, которая имеет только LF-конец. Вам необходимо добавить \r? перед $, чтобы сопоставить окончания LF и CRLF

Вы можете получить и распечатать захваченные подстроки (которые находятся в группе 1) с

[regex]::Matches($fileContent, '(?smi)(.*?)^GO\r?$') | % { "MATCH: $($_.Groups[1].value)`n--END OF MATCH---" }

Примечание $_.Groups[1].value, который обращается к буферу памяти группы 1. Матчи доступны с использованием $_.value. Вы можете делать с результатами все, что вам нужно, вместо печати. ​​

0 голосов
/ 15 апреля 2020

Можно попробовать это:

$a = [regex]::Matches($fileContent,  '(?smi)(^GO.*?END)')

$a[0].Captures[0].value дает:

GO
    IF NOT EXISTS  (select 1 
                from INFORMATION_SCHEMA.COLUMNS
                WHERE TABLE_NAME = 'MyTable' 
                and COLUMN_NAME = 'NewColumn')   
        BEGIN
            ALTER TABLE MyTable 
            ADD NewColumn bit not null DEFAULT(0)
        END

$a[1].Captures[0].value дает:

go
    IF NOT EXISTS  (select 1 
                from INFORMATION_SCHEMA.COLUMNS
                WHERE TABLE_NAME = 'AnotherTable' 
                and COLUMN_NAME = 'AnotherNewColumn')   
        BEGIN
            ALTER TABLE AnotherTable 
            ADD AnotherNewColumn bit not null DEFAULT(0)
        END
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...