ed agrupar cancela os resultados?

0

Ao executar o seguinte comando sed no Windows (para maiúsculas, uma palavra-chave que não faz parte de outra palavra):

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

transformará declare @returntable de SqlFile.Sql em DECLAREreturntable .

Mas a adição de grupos de captura para transportar os caracteres adjacentes para a string de destino, deixará declare lowercased:

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

Por que o sed aplica regras diferentes aos conjuntos agrupados em comparação com os desagrupados?

(Eu sei que os limites de palavras \b são uma maneira melhor de usar palavras-chave maiúsculas, mas observei esse comportamento sed e fiquei imaginando qual era o motivo)

    
por vstrien 13.12.2011 / 17:57

1 resposta

1

É porque "(foo)" não é um grupo de captura para sed , apenas "\(foo\)" é.

Sed normalmente iria errar que você usa e sem grupos de captura definidos, mas isso não acontece porque "\1" aparentemente não se expande para em seu shell (command.exe? ) como eles fazem em bash .

Você está tentando substituir uma string por parênteses literais por um com barras invertidas literais e não corresponde, mantendo declare minúsculas.

    
por 18.10.2012 / 21:41