\f
é o caractere de feed de formulário no Perl. Parece que esses arquivos malformados foram criados por alguém novo no Perl e no XML.
Aqui está uma correção muito Perlier - que também atende aos objetivos do OP de automatizar a atualização de todos os arquivos, ao contrário da resposta aceita com sed, que só funcionará em um arquivo por vez, pois não está emparelhado com find
.
\f
pode simplesmente ser empregado em vez do código hexadecimal x0c
.
find . -type f -exec perl -pi.bkp -e 's [ \f ilename ][ /f ilename ]gx' {} \;
Aqui eu adicionei -type f
ao tel find
para retornar apenas arquivos simples - caso contrário find
, retornará .
à lista e acionará um aviso quando você tentar editá-lo, embora tudo o mais ainda funcione.
Também facilitei a visualização do regex usando a x
flag que ignora o espaço em branco real, permitindo espaçar os elementos do seu regex. Se você não gosta disso, aqui está sem:
find . -type f -exec perl -pi.bkp -e 's[\filename][/filename]g' {} \;
E, no provável caso de todos os caracteres de feed de formulário serem falsos e todos serem substituídos por /f
, você pode reduzir ainda mais a linha única:
find . -type f -exec perl -pi.bkp -e 's[\f][/f]g' {} \;
Você não precisa usar barras para cercar os elementos do comando de substituição de expressões regulares ( s///
) no Perl. Você pode usar qualquer símbolo. Se você optar por usar qualquer tipo de símbolo parecido com colchete, no entanto, precisará usar os dois: s[old][new]
por exemplo.
Como não estou usando barras, não preciso escapar de nenhuma barra.
Quanto a -i.bkp
: perl -pi -e
permite editar no local - mas se você quiser um seguro extra, caso o programa Perl encontre e substitua errado, você pode colocar uma extensão de arquivo para que ele faça uma cópia dos arquivos originais para você. Aqui, eu usei .bkp
.
Nas versões mais recentes do Perl, a edição no local foi atualizada para ser mais resiliente, caso o seu sistema sofra um problema sério, como perda de energia ou falta de espaço em disco também. Aqui está o autor do Perl, Brian Doye, sobre a edição aprimorada no local nos Perls recentes.
Você deve considerar o uso de Perl para esses tipos de tarefas, porque é uma linguagem de programação de uso geral extremamente poderosa, porém subestimada, cujo objetivo original do projeto era substituir sed
e awk
por algo muito melhor.
Os recursos de correspondência de regex do Perl 5 e a sintaxe aprimorada de regex excedem em muito os de sed
,awk
e de fato qualquer outra linguagem de programação além do Perl 6, tornando o Perl a escolha mais sensata para manipulações simples e avançadas de regex.
Para esclarecer: sed
também funcionará bem find
e você também pode sed -i.bkp
fazer um backup de cada arquivo editado, mas até onde eu sei, ele não apresenta a resiliência extra no Perl 5.28 e posterior. Ele também usa a sintaxe de regex UNIX® tradicional, muito mais barulhenta e menos poderosa.
<\filename>
vez de</filename>
em um contexto em\f
que seria interpretado como o caractere de feed de formulário. Você provavelmente deve rastrear a origem desses arquivos e apontar o problema com a ferramenta de geração para o desenvolvedor. Para corrigir os arquivos, a resposta aceita é ótima.