\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 Брайан Д. Фой о улучшенном редактировании на месте в последних версиях Perls.
Вы должны рассмотреть возможность использования Perl для этих видов задач, потому что это чрезвычайно мощные , но недооцененным языком программирования общего назначения, один из которых оригинального дизайна цель был заменить sed
и awk
с чем - то гораздо лучше.
Возможности сопоставления регулярных выражений в Perl 5 и улучшенный синтаксис регулярных выражений намного превосходят возможности sed
, awk
и даже любой другой язык программирования, кроме Perl 6, что делает Perl наиболее разумным выбором как для простых, так и для расширенных манипуляций с регулярными выражениями.
Чтобы уточнить: sed
с ним find
тоже будет хорошо, и вы также можете использовать его sed -i.bkp
для создания резервной копии каждого отредактированного файла, но, насколько я знаю, он не имеет дополнительной устойчивости в Perl 5.28 и выше. Он также использует более грубый и гораздо менее мощный традиционный синтаксис регулярных выражений UNIX ®.
<\filename>
вместо того, чтобы</filename>
в контексте, где\f
будет интерпретироваться как символ подачи формы. Вам, вероятно, следует отследить источник этих файлов и указать разработчику на проблему с их инструментом генерации. Для исправления файлов, принятый ответ просто отлично.