\f
to znak kanału informacyjnego w Perlu. Wygląda na to, że te zniekształcone pliki zostały utworzone przez kogoś nowego zarówno w Perlu, jak i XML.
Oto poprawka o wiele bardziej precyzyjna - która również spełnia cele PO dotyczące zautomatyzowania aktualizacji wszystkich plików, w przeciwieństwie do akceptowanej odpowiedzi z sed, która będzie działać tylko na jednym pliku na raz, ponieważ nie jest sparowany find
.
\f
można po prostu zastosować sam zamiast kodu szesnastkowego x0c
.
find . -type f -exec perl -pi.bkp -e 's [ \f ilename ][ /f ilename ]gx' {} \;
Tutaj dodałem -type f
do tel, aby zwracał find
tylko zwykłe pliki - w przeciwnym razie find
powróci .
na listę i wyśle ostrzeżenie, gdy spróbujesz go edytować, chociaż wszystko inne nadal będzie działać.
Uczyniłem też wyrażenie regularne łatwiejszym, używając x
flagi, która ignoruje prawdziwe białe znaki, pozwalając na rozmieszczenie elementów wyrażenia regularnego. Jeśli ci się nie podoba, tutaj jest bez:
find . -type f -exec perl -pi.bkp -e 's[\filename][/filename]g' {} \;
I w prawdopodobnym przypadku, gdy wszystkie znaki wysuwu formularza są fałszywe i wszystkie powinny zostać zastąpione /f
, możesz jeszcze bardziej odchylić linijkę:
find . -type f -exec perl -pi.bkp -e 's[\f][/f]g' {} \;
Nie musisz używać ukośników, aby otoczyć elementy polecenia podstawienia wyrażenia regularnego ( s///
) w Perlu. Możesz użyć dowolnego symbolu. Jeśli jednak zdecydujesz się na użycie dowolnego sparowanego symbolu przypominającego nawias klamrowy, musisz użyć ich obu: s[old][new]
na przykład.
Ponieważ nie używam ukośników, nie muszę uciekać żadnym ukośnikom.
Jeśli chodzi o -i.bkp
: perl -pi -e
pozwala edytować w miejscu - ale jeśli potrzebujesz dodatkowego ubezpieczenia na wypadek, gdyby Twój program Perl znalazł i zamienił źle, możesz umieścić rozszerzenie pliku, aby utworzyło kopię oryginalnych plików dla ty. Tutaj wykorzystałem .bkp
.
W najnowszych wersjach Perla edycja lokalna została zaktualizowana, aby była bardziej odporna na wypadek poważnych problemów z systemem, takich jak utrata zasilania lub brak miejsca na dysku. Oto autor Perla, brian d foy, na temat ulepszonej edycji na miejscu w najnowszym Perlu.
Należy wziąć pod uwagę przy użyciu Perl dla tego rodzaju zadań, ponieważ jest to bardzo potężne, ale pod oceniane językiem programowania ogólnego przeznaczenia, którego jednym z celów było oryginalne wzornictwo zastąpić sed
i awk
coś znacznie lepiej.
Regex możliwości dopasowywania Perl 5'S i ulepszona składni regex znacznie przekraczają te sed
, awk
i rzeczywiście każdy inny język programowania oprócz Perl 6, dzięki czemu Perl najbardziej rozsądny wybór zarówno dla prostych, jak i zaawansowanych manipulacji regex.
Wyjaśnienie: sed
będzie również działało OK find
i możesz również użyć sed -i.bkp
do wykonania kopii zapasowej każdego edytowanego pliku, ale o ile wiem, nie ma dodatkowej odporności w Perlu 5.28 i nowszych. Wykorzystuje również bardziej skomplikowaną i znacznie mniej wydajną tradycyjną składnię wyrażeń regularnych UNIX ®.
<\filename>
zamiast</filename>
w kontekście, który\f
byłby interpretowany jako znak w formularzu. Prawdopodobnie powinieneś wyśledzić źródło tych plików i zwrócić uwagę programisty na problem z ich narzędziem do generowania. W przypadku naprawy plików zaakceptowana odpowiedź jest w porządku.