unix sed – ¿Cómo usar sed con corchetes redondos?

Pregunta:

Tengo un montón de archivos .php que quería reemplazar todas las apariciones de una cadena.

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

Pensé que lo estaba haciendo bien usando:

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

Lo que terminó sucediendo es que reemplazó jQuery(function con head.ready[(]function

Estaba pensando que podría escapar del ( encerrándolo en bloques [] pero ese no es el caso.

¿Alguien tiene alguna sugerencia?

Respuesta:

( no es un carácter especial en las expresiones regulares sed. No necesita escapar de él.

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

[(] en una expresión regular significa un conjunto de caracteres que contiene solo un elemento, ( . Es una forma complicada de escribir ( .

[(] en el texto de reemplazo significa los tres caracteres [(] . Los corchetes no tienen un significado especial en el texto de reemplazo.

Puede evitar repetir el nombre de la función si lo desea, colocándolo en un grupo. Los grupos están delimitados por paréntesis con barra invertida.

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

Tenga en cuenta que su reemplazo también afectará a jQuery(functionwithsuffix . La manera fácil de evitar esto es usar una herramienta que comprenda las expresiones regulares de Perl extendidas, para que pueda usar (?![^A-Za-z0-9_]) al final de la cadena de búsqueda, que significa "seguido de algo que no es un carácter alfanumérico." Tenga en cuenta que en las expresiones regulares de Perl, ( es especial, debe anteponerlo con una 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'

Leave a Comment

Your email address will not be published.

Scroll to Top

istanbul avukat

-

web tasarım