\f
es el carácter de alimentación de formulario en Perl. Parece que estos archivos con formato incorrecto fueron creados por alguien nuevo en Perl y XML.
Aquí hay una solución mucho más Perlier, que también cumple con los objetivos del OP de automatizar la actualización de todos los archivos, a diferencia de la respuesta aceptada con sed, que solo funcionará en un archivo a la vez, ya que no está emparejado find
.
\f
simplemente puede emplearse en lugar del código hexadecimal x0c
.
find . -type f -exec perl -pi.bkp -e 's [ \f ilename ][ /f ilename ]gx' {} \;
Aquí agregué -type f
a tel find
para que solo devuelva archivos sin formato; de lo contrario find
, volverá a aparecer .
en la lista y activará una advertencia cuando intente editarlo, aunque todo lo demás seguirá funcionando.
También hice que la expresión regular sea más fácil de ver usando la x
bandera que ignora el espacio en blanco real, lo que le permite espaciar los elementos de su expresión regular. Si no te gusta esto, aquí está sin:
find . -type f -exec perl -pi.bkp -e 's[\filename][/filename]g' {} \;
Y en el caso probable de que todos los caracteres de alimentación de formularios sean espurios y todos deben ser reemplazados por /f
, entonces puede reducir aún más la línea:
find . -type f -exec perl -pi.bkp -e 's[\f][/f]g' {} \;
No necesita utilizar barras diagonales para rodear los elementos de su comando de sustitución de expresiones regulares ( s///
) en Perl. Puedes usar cualquier símbolo. Sin embargo, si elige usar cualquier tipo de símbolo pareado entre paréntesis, debe usar ambos: s[old][new]
por ejemplo.
Como no estoy usando barras, no tengo que escapar de ninguna barra.
En cuanto a -i.bkp
: le perl -pi -e
permite editar en el lugar, pero si desea un seguro adicional en caso de que su programa Perl de buscar y reemplazar sea incorrecto, puede colocar una extensión de archivo para que haga una copia de los archivos originales para tú. Aquí lo he usado .bkp
.
En las versiones más recientes de Perl, la edición en el lugar se ha actualizado para que sea más resistente en caso de que su sistema sufra un problema grave como pérdida de energía o quedarse sin espacio en disco. Aquí está el autor de Perl, brian d foy, sobre la edición in situ mejorada en Perls recientes.
Debería considerar usar Perl para este tipo de tareas, porque es un lenguaje de programación de propósito general extremadamente potente pero subestimado, uno de cuyos objetivos de diseño originales era reemplazar sed
y awk
con algo mucho mejor.
Las capacidades de coincidencia de expresiones regulares de Perl 5 y la sintaxis de expresiones regulares mejoradas superan con creces las de sed
, awk
y de hecho cualquier otro lenguaje de programación, aparte de Perl 6, lo que hace que Perl sea la opción más sensata para manipulaciones de expresiones regulares simples y avanzadas.
Para aclarar: sed
también funcionará bien find
y también puede usar sed -i.bkp
para hacer una copia de seguridad de cada archivo editado, pero que yo sepa, no presenta la resistencia adicional en Perl 5.28 y superior. También utiliza la sintaxis tradicional de expresiones regulares de UNIX ® más clunkier y mucho menos potente.
<\filename>
lugar de</filename>
en un contexto en el\f
que se interpretaría como el personaje del formulario. Probablemente deberías rastrear la fuente de estos archivos y señalar el problema con su herramienta de generación al desarrollador. Para arreglar los archivos, la respuesta aceptada está bien.