instalar - ¿Por qué tengo que especificar el modificador-i con una extensión de copia de seguridad cuando uso ActivePerl?
perl download (2)
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
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?
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*<property name="blah" value="false" />/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.