Estoy intentando buscar y reemplazar una URL presente en el código fuente de archivos html/css en la carpeta y subcarpetas de destino. He intentado utilizar el siguiente comando:
find . -type f | xargs sed -i 's/https\:*\.websitedomain\.fr\///g'
¿Qué me estoy perdiendo?
Gracias de antemano por cualquier consejo.
Respuesta1
Suponiendo un sistema GNU (que su uso sed -i
sugiere es su caso):
eregex='https://[^/[:space:]]+\.websitedomain\.fr/'
find . -type f -exec grep -lZEe "$eregex" {} + |
xargs -r0 sed -i -E "s|$eregex||g"
Algunos de los problemas en su enfoque:
- el principal es que el
*
operador regexp coincide con 0 o más del átomo anterior, por lo que:*
coincide con 0 o más:
s. Aquí lo estamos reemplazando con[^/[:space:]]+
cuál es 1 o más (+
, un operador de expresiones regulares extendido, de ahí la-E
s) caracteres distintos de los espacios en blanco y/
(.*
que es probablemente lo que tenía en mente y podría terminar coincidiendo,google.com/ and foo
porhttps://google.com/ and foo.websitedomain.fr/file
ejemplo). - El formato de salida de
find -print
(una ruta de archivo por línea) no es compatible con el formato de entrada esperado dexargs
(se esperan palabras en blanco o separadas por una nueva línea, posiblemente entre comillas). El formato de salida defind -print
no se puede posprocesar de manera confiable; solo debe usarse para consumo humano. Es mejor usarfind ... -exec cmd {} +
y/o usar registros delimitados por NUL conxargs -r0
(-r
y-0
ser extensiones GNU). sed -i
reemplaza los archivos con una copia modificada del original, con posible pérdida de información de metadatos, por lo que es mejor evitar ejecutar archivos que no van a ser modificados, de ahí el uso ogrep -lZ
para obtener una lista (delimitada con NUL-Z
para que pueda ser utilizado porxargs -0
) de archivos con al menos una línea que coincida con la expresión regular.:
no es un operador de expresión regular, por lo que no es necesario escaparlo.\:
POSIX no especifica qué coincidencias y no está documentado en la mayoría desed
las implementaciones. Entonces, si bien actualmente puede coincidir con a:
en sused
implementación, eso puede cambiar en el futuro (como\<
o\w
mientras originalmente coincidía con<
yw
respectivamente terminó coincidiendo con un límite de palabra y un carácter de palabra en versiones más nuevas).- Si su expresión regular o reemplazo en
sed
els
comando contiene un/
, es más fácil usar un carácter diferente como delimitador que tener que escapar/
con barras invertidas, lo que hace que sea bastante difícil de leer. Por lo tantos|regexp|replacement|g
aquí en lugar des/regexp/replacement/g
. Me gusta|
porque hace que el código sea legible. Tiene la desventaja de que no se puede usar enex
/vi
aunques/regex/replacement/
como comandos|
separadosex
allí (también es un operador de expresiones regulares extendido).
Respuesta2
Prueba esto:
find . -type f | xargs sed -i 's/test\.com/set\.com/g'
Si necesita probar la inclusión dehttpsentonces prueba esto:
find . -type f | xargs sed -i 's/https\:\\\\test\.com/https\:\\\\set\.com/g'
NOTA*: esto reemplazaprueba.comconconjunto.com