\f
è il carattere di feed del modulo in Perl. Sembra che questi file non validi siano stati creati da qualcuno nuovo sia in Perl che in XML.
Ecco una correzione molto Perlier - che soddisfa anche gli obiettivi dell'OP di automatizzare l'aggiornamento di tutti i file, a differenza della risposta accettata con sed, che funzionerà su un solo file alla volta in quanto non associato find
.
\f
può semplicemente essere impiegato da solo invece del codice esadecimale x0c
.
find . -type f -exec perl -pi.bkp -e 's [ \f ilename ][ /f ilename ]gx' {} \;
Qui ho aggiunto -type f
a tel find
per restituire solo file semplici, altrimenti find
tornerà .
nell'elenco e genererà un avviso quando si tenta di modificarlo, sebbene tutto il resto continuerà a funzionare.
Ho anche reso il regex più facile da vedere usando la x
bandiera che ignora gli spazi reali, permettendoti di distanziare gli elementi del tuo regex. Se non ti piace questo, eccolo senza:
find . -type f -exec perl -pi.bkp -e 's[\filename][/filename]g' {} \;
E nel caso probabile che tutti i caratteri del feed del modulo siano spuri e che tutti debbano essere sostituiti da /f
, è possibile ridurre ulteriormente il limite di una riga:
find . -type f -exec perl -pi.bkp -e 's[\f][/f]g' {} \;
Non è necessario utilizzare le barre in avanti per circondare gli elementi del comando di sostituzione regex ( s///
) in Perl. Puoi usare qualsiasi simbolo. Se si sceglie di utilizzare qualsiasi tipo di simbolo simile a parentesi quadre, tuttavia, è necessario utilizzare entrambi: s[old][new]
ad esempio.
Dal momento che non sto usando le barre, non devo sfuggire a nessuna barra.
Per quanto riguarda -i.bkp
: perl -pi -e
consente di modificare sul posto - ma se si desidera un'assicurazione aggiuntiva nel caso in cui il programma Perl di ricerca e sostituzione sia errato, è possibile inserire un'estensione di file in modo che crei una copia dei file originali per voi. Ecco, l'ho usato .bkp
.
Nelle versioni più recenti di Perl, la modifica sul posto è stata aggiornata per essere più resiliente nel caso in cui il sistema subisca un problema grave come la perdita di energia o anche lo spazio su disco. Ecco l'autore del Perl brian d foy sul miglioramento delle modifiche sul posto negli ultimi Perls.
Dovresti considerare l'utilizzo di Perl per questo tipo di attività, perché è un linguaggio di programmazione per scopi generici estremamente potente ma sottovalutato, uno dei cui obiettivi progettuali originali era quello di sostituire sed
e awk
con qualcosa di molto meglio.
Le capacità di corrispondenza regex di Perl 5 e la sintassi regex migliorata superano di gran lunga quelle di sed
, awk
e in effetti tutti gli altri linguaggi di programmazione oltre a Perl 6, rendendo Perl la scelta più sensata per manipolazioni regex sia semplici che avanzate.
Per chiarire: sed
funzionerà bene find
anche con e puoi anche usare sed -i.bkp
per fare un backup di ogni file modificato, ma per quanto ne so non presenta la resilienza extra in Perl 5.28 e versioni successive. Utilizza anche la sintassi di regex UNIX ® tradizionale più clunkier e molto meno potente.
<\filename>
invece che</filename>
in un contesto in cui\f
sarebbe stato interpretato come il carattere del feed del modulo. Probabilmente dovresti rintracciare l'origine di questi file e sottolineare il problema con il loro strumento di generazione allo sviluppatore. Per correggere i file, la risposta accettata va bene.