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'