\f
ist das Formular-Feed-Zeichen in Perl. Es sieht so aus, als ob diese fehlerhaften Dateien von jemandem erstellt wurden, der sowohl in Perl als auch in XML neu ist.
Hier ist ein viel früherer Fix - der auch die Ziele des OP erfüllt, die Aktualisierung aller Dateien zu automatisieren, im Gegensatz zu der akzeptierten Antwort mit sed, die jeweils nur für eine Datei funktioniert, da sie nicht mit gekoppelt ist find
.
\f
kann einfach selbst anstelle des Hexadezimalcodes verwendet werden x0c
.
find . -type f -exec perl -pi.bkp -e 's [ \f ilename ][ /f ilename ]gx' {} \;
Hier habe ich -type f
zu tel hinzugefügt , find
um nur einfache Dateien zurückzugeben - andernfalls find
wird .
in der Liste zurückgegeben und eine Warnung ausgelöst, wenn Sie versuchen, sie zu bearbeiten, obwohl alles andere weiterhin funktioniert.
Ich habe es auch einfacher gemacht, den regulären Ausdruck zu sehen, indem ich das x
Flag verwendet habe, das echte Leerzeichen ignoriert, sodass Sie die Elemente Ihres regulären Ausdrucks entfernen können. Wenn Ihnen das nicht gefällt, ist es hier ohne:
find . -type f -exec perl -pi.bkp -e 's[\filename][/filename]g' {} \;
Und in dem wahrscheinlichen Fall, dass alle Formularvorschubzeichen falsch sind und alle durch ersetzt werden sollten /f
, können Sie den Einzeiler noch weiter verkleinern:
find . -type f -exec perl -pi.bkp -e 's[\f][/f]g' {} \;
Sie müssen keine Schrägstriche verwenden, um die Elemente ( s///
) Ihres Regex-Ersetzungsbefehls in Perl zu umgeben. Sie können ein beliebiges Symbol verwenden. Wenn Sie sich jedoch für die Verwendung eines gepaarten klammerartigen Symbols entscheiden, müssen Sie beide verwenden: s[old][new]
zum Beispiel.
Da ich keine Schrägstriche verwende, muss ich keinen Schrägstrichen entkommen.
Wie für -i.bkp
: perl -pi -e
Ermöglicht das Bearbeiten vor Ort. Wenn Sie jedoch eine zusätzliche Versicherung wünschen, falls Ihr Perl-Programm zum Suchen und Ersetzen falsch ist, können Sie eine Dateierweiterung eingeben, damit eine Kopie der Originaldateien für erstellt wird Du. Hier habe ich benutzt .bkp
.
In den neuesten Perl-Versionen wurde die direkte Bearbeitung aktualisiert, um die Ausfallsicherheit zu erhöhen, falls auf Ihrem System ein ernstes Problem wie Stromausfall oder Speicherplatzmangel auftritt. Hier ist der Perl-Autor Brian D Foy über die verbesserte In-Place-Bearbeitung in den letzten Perls.
Sie sollten mit Perl für diese Art von Aufgaben betrachten, weil es eine extrem leistungsstarke und dennoch unterbewertet Allzweck- Programmiersprache ist, von deren ursprünglichen Entwurfsziele war zu ersetzen sed
und awk
mit etwas viel besser.
Perl 5 regex Matching - Fähigkeiten und verbesserte regex Syntax weit über die von sed
, awk
und in der Tat jeder anderen Programmiersprache abgesehen von Perl 6, so dass Perl die vernünftigste Wahl für einfache und erweitern Regex Manipulationen.
Zur Verdeutlichung: Funktioniert auch sed
mit OK find
und Sie können auch sed -i.bkp
eine Sicherungskopie jeder bearbeiteten Datei erstellen, aber soweit ich weiß, bietet sie nicht die zusätzliche Ausfallsicherheit in Perl 5.28 und höher. Es verwendet auch die klobigere und weitaus weniger leistungsfähige traditionelle UNIX ® -Regex-Syntax.
<\filename>
anstatt</filename>
in einem Kontext, in dem\f
dies als Formular-Feed-Zeichen interpretiert wird. Sie sollten wahrscheinlich die Quelle dieser Dateien ausfindig machen und den Entwickler auf das Problem mit dem Generierungswerkzeug hinweisen. Zum Reparieren der Dateien ist die akzeptierte Antwort in Ordnung.