sustituir script reemplazar manejo linea leer insertar fichero especiales comando caracteres cadenas bash sed quoting gnu-sed

bash - script - sed linux



Sed da: sed: no se puede leer: No hay tal archivo o directorio (1)

Tengo el siguiente script bash que se repite para cada imagen encontrada. Necesita iterar sobre todos los archivos html , css y js , y reemplazar todas las ocurrencias de una imagen dentro de ese archivo.

for image in app/www/images-theme-dark/*.png do echo "installing icon" $image # extract filename from iconpath iconfile=$(basename $image) iconPath="images/"$(basename $image) # replace paths in all files containing icon paths find app/www -type f /( -name "*.html" -or -name "*.css" -or -name "*.js" / -or -name "*.appcache" /) / -exec sed -i '''' -e ''s|$iconPath|images-theme-dark/$iconfile|g'' "{}" /; done

Sin embargo, cuando ejecuto el script, sed da:

sed: can''t read : No such file or directory

En StackOverflow he encontrado sed: no puedo leer: no existe ese archivo o directorio, pero ya tenía comillas {}

Cuando hago eco del comando sed y lo ejecuto manualmente en la línea de comandos, no hay ningún error.

Estoy usando GNU sed v4.2.2 en Raspbian GNU / Linux 8.0 (jessie)

¿Alguien ve lo que podría estar mal aquí?


( Compilando una respuesta a partir de los comentarios, el know-how es de melpomene y AlexP ) .

¿Qué es eso después de sed -i ?

-i significa in situ, es decir, editar en el archivo directamente.
-i '''' significa editar en su lugar un archivo cuyo nombre es la cadena vacía.
Dado que probablemente no haya ningún archivo cuyo nombre sea la cadena vacía, sed se queja de que no puede leerlo.

Nota 1 dependencia de la plataforma :
La sintaxis de -i es una diferencia entre GNU sed y sed de mac os.

Nota 2 : orden de argumentos "habitual" :
El -e cambia para indicar que el código de sed permite tenerlo entre los nombres de los archivos.
Esta es una trampa (en la que, por ejemplo, me pillaron avergonzante), al hacerte tropezar con tus expectativas de lo que encuentras en una línea de comando sed.
Permite
sed -i filename -e "expression" AnotherFileName
que es una versión involuntariamente camuflada de
sed -i''NoExtensionGiven'' "expression" filename AnotherFileName .