¿Por qué tengo que especificar el modificador -i con una extensión de copia de seguridad cuando uso ActivePerl?

No puedo editar en línea las soluciones Perl one-liners que se ejecutan bajo ActivePerl para que funcionen a menos que las especifique con una extensión de copia de seguridad:

C:\> perl -i -ape "splice (@F, 2, 0, q(inserted text)); $_ = qq(@F\n);" file1.txt Can't do inplace edit without backup. 

El mismo comando con -i.bak o -i.orig funciona bien, pero crea un archivo de copia de seguridad no deseado en el proceso.

¿Hay alguna forma de evitar esto?

Esta es una limitación de Windows / MS-DOS. De acuerdo con Perldiag :

Estás en un sistema como MS-DOS que se confunde si intentas leer desde un archivo eliminado (pero aún abierto). Tienes que decir -i.bak, o algo así.

La implementación de -i de Perl hace que elimine file1.txt mientras mantiene un control abierto para él, luego vuelve a crear el archivo con el mismo nombre. Esto le permite ‘leer’ archivo1.txt aunque se haya eliminado y se vuelva a crear. Desafortunadamente, Windows / MS-DOS no le permite eliminar un archivo que tiene un controlador abierto asociado, por lo que este mecanismo no funciona.

Su mejor -i.bak es usar -i.bak y luego eliminar el archivo de respaldo. Esto al menos le brinda cierta protección, por ejemplo, puede optar por no eliminar la copia de seguridad si perl sale con un código de salida distinto de cero. Algo como:

 perl -i.bak -ape "splice...." file1.txt && del file1.bak 

Muestra con recursivo modificar y eliminar ambos hechos por find. Funciona en, por ejemplo, mingw git bash en windows.

 $ find . -name "*.xml" -print0 | xargs -0 perl -p -i.bak -e 's#\s*\s*##g' $ find . -name "*.bak" -print0 | xargs -0 rm 

Valores binarios terminados pasados ​​entre find / xargs para manejar espacios. S / prefijo inusual para evitar manipular xml en el término de búsqueda. Esto supone que no tenía ningún archivo .bak dando vueltas para comenzar.

Intereting Posts