Pregunta El comando sed Buscar y reemplazar en el archivo y sobrescribir el archivo no funciona, vacía el archivo


Me gustaría ejecutar un descubrimiento y reemplazarlo en un archivo HTML a través de la línea de comando.

Mi comando se ve así:

sed -e s/STRING_TO_REPLACE/STRING_TO_REPLACE_IT/g index.html > index.html

Cuando ejecuto esto y miro el archivo después, está vacío. Borró el contenido de mi archivo.

Cuando ejecuto esto después de restaurar el archivo de nuevo:

sed -e s/STRING_TO_REPLACE/STRING_TO_REPLACE_IT/g index.html

los stdout es el contenido del archivo, y el buscar y reemplazar ha sido ejecutado.

¿Por qué está pasando esto?


508
2018-03-02 18:44


origen


Respuestas:


Cuando el cáscara ve > index.html en la línea de comando, abre el archivo index.html para escritura, limpiando todos sus contenidos previos.

Para arreglar esto, necesitas pasar el -i opción de sed para realizar los cambios en línea y crear una copia de seguridad del archivo original antes de realizar los cambios in situ:

sed -i.bak s/STRING_TO_REPLACE/STRING_TO_REPLACE_IT/g index.html

Sin .bak, el comando fallará en algunas plataformas, como Mac OSX.


779
2018-03-02 18:48



Un patrón alternativo, útil, es:

sed -e 'script script' index.html > index.html.tmp && mv index.html.tmp index.html

Eso tiene el mismo efecto, sin usar el -i opción, y además significa que, si el script sed falla por algún motivo, el archivo de entrada no se destruye. Además, si la edición es exitosa, no queda ningún archivo de respaldo. Este tipo de modismo puede ser útil en Makefiles.

Muchos seds tienen el -i opción, pero no todos ellos; el posix sed es uno que no. Si apunta a la portabilidad, por lo tanto, es mejor evitarlo.


187
2018-03-02 22:32



sed -i 's/STRING_TO_REPLACE/STRING_TO_REPLACE_IT/g' index.html

Esto realiza una sustitución global in situ en el archivo index.html. Citar la cadena evita problemas con el espacio en blanco en la consulta y el reemplazo.


74
2017-08-09 20:58



use la opción -i de sed, p.

sed -i bak -e s/STRING_TO_REPLACE/REPLACE_WITH/g index.html

50
2018-03-02 18:48



Para cambiar varios archivos (y guardar una copia de seguridad de cada uno como * .bak):

perl -p -i -e "s/\|/x/g" *  

tomará todos los archivos en el directorio y reemplazará | con x esto se llama "pastel Perl" (fácil como un pastel)


18
2018-06-20 20:54



Deberías intentar usar la opción -i para la edición en el lugar.


13
2018-03-02 18:49



junto al -i opción de sed puedes usar el tee utilidad.

De man:

tee - leer desde entrada estándar y escribir en salida estándar y archivos

Entonces, la solución sería:

sed s/STRING_TO_REPLACE/STRING_TO_REPLACE_IT/g index.html | tee index.html

4
2017-07-16 22:06



El problema con el comando

sed 'code' file > file

es eso file es truncado por el caparazón antes de que sed realmente lo procese. Como resultado, obtienes un archivo vacío.

La mejor manera de hacer esto es usar -i editar en el lugar, como sugirieron otras respuestas. Sin embargo, esto no es siempre lo que quieres. -i creará un archivo temporal que luego será utilizado para reemplazar el archivo original. Esto es problemático si su archivo original era un enlace (el enlace será reemplazado por un archivo normal). Si necesita conservar enlaces, puede usar una variable temporal para almacenar el resultado de sed antes de volver a escribirlo en el archivo, como este:

tmp=$(sed 'code' file); echo -n "$tmp" > file

Mejor aún, usa printf en lugar de echo ya que echo es probable que procese \\ como \ en algunos proyectiles (por ejemplo, guión):

tmp=$(sed 'code' file); printf "%s" "$tmp" > file

4
2017-07-29 22:21



sed -i.bak "s#https.*\.com#$pub_url#g" MyHTMLFile.html

Si tiene un enlace para agregar, intente esto. Busque la URL como se indica arriba (comenzando con https y terminando con aquí aquí) y reemplácela con una cadena de URL. He usado una variable $pub_urlaquí. s aquí significa búsqueda y g significa reemplazo global.

Funciona !


4
2017-10-09 06:24