Buscar y reemplazar con buscar y xargs no funciona

Buscar y reemplazar con buscar y xargs no funciona

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 -isugiere 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 -Es) 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 foopor https://google.com/ and foo.websitedomain.fr/fileejemplo).
  • El formato de salida de find -print(una ruta de archivo por línea) no es compatible con el formato de entrada esperado de xargs(se esperan palabras en blanco o separadas por una nueva línea, posiblemente entre comillas). El formato de salida de find -printno se puede posprocesar de manera confiable; solo debe usarse para consumo humano. Es mejor usar find ... -exec cmd {} +y/o usar registros delimitados por NUL con xargs -r0( -ry -0ser extensiones GNU).
  • sed -ireemplaza 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 o grep -lZpara obtener una lista (delimitada con NUL -Zpara que pueda ser utilizado por xargs -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 de sedlas implementaciones. Entonces, si bien actualmente puede coincidir con a :en su sedimplementación, eso puede cambiar en el futuro (como \<o \wmientras originalmente coincidía con <y wrespectivamente 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 sedel scomando 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 tanto s|regexp|replacement|gaquí en lugar de s/regexp/replacement/g. Me gusta |porque hace que el código sea legible. Tiene la desventaja de que no se puede usar en ex/ viaunque s/regex/replacement/como comandos |separados exallí (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

información relacionada