Как заменить слово на новую строку и слово с помощью регулярного выражения с пустой строкой в ​​Powershell?

Как заменить слово на новую строку и слово с помощью регулярного выражения с пустой строкой в ​​Powershell?

Ниже приведен пример содержимого ... Мне нужно удалить все use database и go, которые я использую для редактора powershell и powershell_ise:

использовать database_instance

go

если условие


person Ian    schedule 18.08.2014    source источник
comment
используйте \n для соответствия новой строке   -  person Tim.Tang    schedule 18.08.2014
comment
это не работает ... Я действительно пробовал это .. $ out -replace / use database_ \ w + \ n \ w + / g   -  person Ian    schedule 18.08.2014
comment
зачем использовать _ в вашем регулярном выражении? вы можете попробовать это: /use database\n\s*\w+/g   -  person Tim.Tang    schedule 18.08.2014
comment
извините, забыл упомянуть, что должно быть подчеркивание, после подчеркивания должно быть имя экземпляра.   -  person Ian    schedule 18.08.2014
comment
Отредактируйте свой вопрос, чтобы показать, как вы хотите, чтобы результат выглядел.   -  person briantist    schedule 18.08.2014


Ответы (2)


Вам нужно сопоставить Newline, а также space после новой строки:

/use database_\w+\n\s*\w+/g
person Tim.Tang    schedule 18.08.2014

$sql = @"
use database_instance

go

if condition
"@

$sql -ireplace 'use\s+\w+_\w+\s*(?:\r?\n)+\s*go' , ''

Как это работает:

  1. Использование -ireplace для регулярного выражения без учета регистра.
  2. Найдите слово use, за которым следует один или несколько пробелов \s+, за которыми следует один или несколько символов слова \w+, а затем знак подчеркивания _.
  3. Один или несколько символов слова \w+, за которым следует 0 или несколько пробелов (на всякий случай)
  4. Группа без захвата (?:), поскольку нам не нужен результат, это просто инкапсуляция новой строки, которая учитывает окончания строк в окнах и unix. Он состоит из необязательного CR, за которым следует LF, и это соответствует 1 или более раз.
  5. За ним следует 0 или более пробелов \s*, а затем слово go.
  6. Ничего не заменить!

Это оставляет некоторое пустое место, но это не должно быть большой проблемой, поскольку синтаксическому анализатору SQL все равно.

Примечание

В своих комментариях вы сказали, что пробовали:

$out -replace "/use database_\w+\n\w+/g"

Имейте в виду, что powershell не использует синтаксис /regexhere/. Прямая косая черта обрабатывается как литералы, так же как и указанные вами флаги. По умолчанию замена является глобальной, так что g вам в любом случае не понадобится.

person briantist    schedule 18.08.2014
comment
Ваш образец работает, но когда я пробую его на своих данных, он не работает ... не знаю почему ... мои данные были получены из командного файла, он извлекает хранимую процедуру и помещает ее в переменную, которая является $ out Переменная. - person Ian; 18.08.2014
comment
Опубликуйте вывод [RegEx]::Escape($out) - person briantist; 18.08.2014
comment
См. Ниже .. используйте \ margining_prd \ go \ \ IF \ EXISTS \ - person Ian; 18.08.2014
comment
Все еще не заменяя, в PowerShell я использовал dllgen.bat для подключения к sybase и получения нужного мне sp. а затем сохраните его в выходной переменной ($ out) ... после этого нужно удалить некоторые вещи в строке (SP) ... - person Ian; 18.08.2014