Como usar o sed com colchetes?

4

Eu tenho um monte de arquivos .php que eu queria substituir todas as ocorrências de uma string.

find: jQuery(function
replace: head.ready(function

Eu achei que estava fazendo certo usando:

find . -name '*.php' -exec sed -e 's/jQuery[(]function/head.ready[(]function/g' -i'.bak' {} \;

O que acabou acontecendo é que ele substituiu jQuery(function por head.ready[(]function

Eu estava pensando que poderia escapar do ( colocando-o em blocos [] , mas esse não é o caso.

Alguém tem alguma sugestão?

    
por Tegan Snyder 28.06.2013 / 00:55

2 respostas

11

( não é um caractere especial em expressões regulares sed. Você não precisa escapar disso.

sed -e 's/jQuery(function/head.ready(function/g'

[(] em um regex significa um conjunto de caracteres contendo apenas um elemento, ( . É uma maneira complicada de escrever ( .

[(] no texto de substituição significa os três caracteres [(] . Os colchetes não têm significado especial no texto de substituição.

Você pode evitar repetir o nome da função, se quiser, colocando-o em um grupo. Grupos são delimitados por parênteses de barra invertida.

sed -e 's/jQuery(\(function\)/head.ready(/g'

Tenha em atenção que a sua substituição também afetará jQuery(functionwithsuffix . A maneira fácil de evitar isso é usar uma ferramenta que entende expressões regulares Perl estendidas, para que você possa usar (?![^A-Za-z0-9_]) no final da string de pesquisa, o que significa “seguido por algo que não é um caractere alfanumérico”. Observe que, nas expressões regulares do Perl, ( é especial, você precisa prefixá-lo com uma barra invertida.

perl -pe 's/jQuery\(function(?![^A-Za-z0-9_])/head.ready(function/g'
perl -pe 's/jQuery\((function)(?![^A-Za-z0-9_])/head.ready($1/g'
    
por 28.06.2013 / 01:13
2

Não há necessidade de escapar dos parênteses na string de substituição.

sed -e 's/jQuery[(]function/head.ready(function/g'
    
por 28.06.2013 / 01:08

Tags