\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.
\fpuò 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 fa tel findper restituire solo file semplici, altrimenti findtornerà .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 xbandiera 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 -econsente 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 sede awkcon qualcosa di molto meglio.
Le capacità di corrispondenza regex di Perl 5 e la sintassi regex migliorata superano di gran lunga quelle di sed, awke 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: sedfunzionerà bene findanche con e puoi anche usare sed -i.bkpper 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\fsarebbe 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.