При запуске следующей команды sed в Windows (заглавная буква ключевого слова не является частью другого слова):

"c:\Program Files (x86)\GnuWin32\bin\sed.exe" -e "s/[^a-z]*declare[^a-z]*/DECLARE/I" "SqlFile.sql"

превратится declare @returntable из SqlFile.Sql в DECLAREreturntable .

Но добавление групп захвата для переноса окружающих символов в строку назначения приведет к declare нижнем регистре:

"c:\Program Files (x86)\GnuWin32\bin\sed.exe" -e "s/([^a-z]*)declare([^a-z]*)/\\1DECLARE\\2/I" "SqlFile.sql"

Почему sed применяет различные правила к сгруппированным наборам по сравнению с несгруппированными?

(Я знаю, что границы слов \b - лучший способ прописывать ключевые слова, но я наблюдал такое поведение sed и задавался вопросом, в чем причина)

1 ответ1

1

Это потому, что "(foo)" не является группой захвата для sed , только "\(foo\)" .

Sed обычно выдает ошибку, что вы используете \1 и \2 без каких-либо определенных групп захвата, но это не так, потому что "\\1" явно не расширяется до \1 в вашей оболочке (command.exe?) как они делают в bash .

Таким образом, вы пытаетесь заменить строку с буквенными скобками на строку с буквенными обратными слешами, и она не совпадает, сохраняя declare нижнем регистре.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .