\f
est le caractère de flux de formulaire en Perl. Il semble que ces fichiers mal formés aient été créés par quelqu'un de nouveau à Perl et XML.
Voici un correctif beaucoup plus Perlier - qui répond également aux objectifs du PO d'automatiser la mise à jour de tous les fichiers, contrairement à la réponse acceptée avec sed, qui ne fonctionnera que sur un fichier à la fois car il n'est pas associé find
.
\f
peut simplement être utilisé lui-même au lieu du code hexadécimal x0c
.
find . -type f -exec perl -pi.bkp -e 's [ \f ilename ][ /f ilename ]gx' {} \;
Ici, j'ai ajouté -type f
à tel find
pour ne renvoyer que des fichiers simples - sinon, find
il reviendra .
dans la liste et déclenchera un avertissement lorsque vous essayez de le modifier, bien que tout le reste fonctionne.
J'ai également rendu l'expression plus facile à voir en utilisant le x
drapeau qui ignore les espaces blancs réels, vous permettant d'espacer les éléments de votre expression régulière. Si vous n'aimez pas ça, le voici sans:
find . -type f -exec perl -pi.bkp -e 's[\filename][/filename]g' {} \;
Et dans le cas probable où tous les caractères de flux de formulaire sont faux et tous devraient être remplacés par /f
, alors vous pouvez affiner encore plus le one-liner:
find . -type f -exec perl -pi.bkp -e 's[\f][/f]g' {} \;
Vous n'avez pas besoin d'utiliser des barres obliques pour entourer les éléments de votre commande de substitution de regex ( s///
) en Perl. Vous pouvez utiliser n'importe quel symbole. Si vous choisissez d'utiliser n'importe quel type de symbole en forme de parenthèse, cependant, vous devez utiliser les deux: s[old][new]
par exemple.
Comme je n'utilise pas de barres obliques, je n'ai pas à échapper à aucune barre oblique.
Quant à -i.bkp
: perl -pi -e
vous permet de modifier sur place - mais si vous voulez une assurance supplémentaire au cas où vous auriez mal votre programme de recherche et remplacement Perl, vous pouvez mettre une extension de fichier afin qu'il fasse une copie des fichiers originaux pour vous. Ici, je l'ai utilisé .bkp
.
Dans les versions les plus récentes de Perl, l'édition sur place a été mise à jour pour être plus résistante au cas où votre système souffrirait également d'un problème grave comme une panne de courant ou un manque d'espace disque. Voici l'auteur de Perl, Brian D Foy, sur l'amélioration de l'édition in situ dans les Perls récents.
Vous devriez envisager d'utiliser Perl pour ce type de tâches, car il s'agit d'un langage de programmation à usage général extrêmement puissant mais sous-évalué, dont l'un des objectifs de conception d'origine était de remplacer sed
et awk
avec quelque chose de bien meilleur.
Les capacités de correspondance regex de Perl 5 et la syntaxe regex améliorée dépassent de loin celles de sed
, awk
et en fait tous les autres langages de programmation à part Perl 6, faisant de Perl le choix le plus judicieux pour les manipulations regex simples et avancées.
Pour clarifier: sed
fonctionnera bien find
aussi et vous pouvez également utiliser sed -i.bkp
pour faire une sauvegarde de chaque fichier modifié, mais pour autant que je sache, il ne dispose pas de la résilience supplémentaire dans Perl 5.28 et supérieur. Il utilise également la syntaxe regex UNIX ® traditionnelle plus maladroite et beaucoup moins puissante.
<\filename>
plutôt que</filename>
dans un contexte où\f
serait interprété comme le caractère de flux de formulaire. Vous devriez probablement retrouver la source de ces fichiers et signaler le problème avec leur outil de génération au développeur. Pour réparer les fichiers, la réponse acceptée est très bien.