\f
- це символ подачі форми в Perl. Схоже, ці неправильно сформовані файли створив хтось новий, як Perl, так і XML.
Ось набагато виправлення Perlier - яке також відповідає цілям OP щодо автоматизації оновлення всіх файлів, на відміну від прийнятої відповіді з sed, яка працюватиме лише на одному файлі за один раз, оскільки він не є парним find
.
\f
можна просто використовувати сам замість шістнадцяткового коду x0c
.
find . -type f -exec perl -pi.bkp -e 's [ \f ilename ][ /f ilename ]gx' {} \;
Тут я додав -type f
у tel, find
щоб повертати лише звичайні файли - інакше find
повернеться .
у списку та викликає попередження, коли ви намагатиметесь його відредагувати, хоча все інше все одно буде працювати.
Я також полегшив бачити регулярний вираз, використовуючи x
прапор, який ігнорує реальну пробіл, що дозволяє виділяти елементи регексу. Якщо вам це не подобається, ось без нього:
find . -type f -exec perl -pi.bkp -e 's[\filename][/filename]g' {} \;
І, ймовірно, що всі символи подачі форми є хибними та їх слід замінити /f
, тоді ви можете зменшити однорядковий ліній ще нижче:
find . -type f -exec perl -pi.bkp -e 's[\f][/f]g' {} \;
Вам не потрібно використовувати косою косою рискою для оточення елементів ( s///
) команди заміщення регулярних виразів у Perl. Ви можете використовувати будь-який символ. Якщо ви вирішили використовувати будь-який парний символ, схожий на дужки, вам доведеться використовувати обидва: s[old][new]
наприклад.
Оскільки я не використовую косої риси, мені не потрібно уникати жодної косої риски.
Що стосується -i.bkp
: perl -pi -e
дозволяє редагувати на місці - але якщо ви хочете отримати додаткове страхування у випадку, якщо ви неправильно знайшли програму пошуку та заміни Perl, ви можете помістити розширення файлу, щоб воно зробило копію оригінальних файлів для ви. Ось, я використав .bkp
.
В останніх версіях Perl оновлене редагування було оновлено, щоб бути більш стійким у випадку, якщо ваша система має серйозні проблеми, такі як втрата електроенергії або втрачає місце на диску. Ось автор Perl Браян d foy щодо вдосконаленого редагування на місці в останніх Perls.
Вам слід подумати про використання Perl для подібних завдань, оскільки це надзвичайно потужна, але недооцінена мова програмування загального призначення, однією з оригінальних цілей дизайну якої була заміна sed
та awk
щось набагато краще.
Можливості відповідності регулярних виразів Perl 5 та вдосконалений синтаксис регулярних виразів значно перевищують можливості sed
, awk
та й справді будь-якої іншої мови програмування, крім Perl 6, що робить Perl найбільш розумним вибором як для простих, так і просунутих маніпуляцій з регулярними виразками.
Для уточнення: sed
буде працювати добре з find
занадто, і ви також можете використовувати sed -i.bkp
резервну копію кожного редагованого файлу, але, наскільки я знаю, він не має додаткової стійкості в Perl 5.28 і вище. Він також використовує незграбний і набагато менш потужний традиційний синтаксис регулярного зворотного виразів UNIX ®.
<\filename>
замість цього</filename>
контексту, де\f
інтерпретувався як символ подачі форми. Вам, мабуть, слід знайти джерело цих файлів і вказати на проблему з їх генераційним інструментом розробнику. Для виправлення файлів прийнята відповідь просто чудова.