Как искать и заменять только текстовые файлы? - PullRequest
0 голосов
/ 17 августа 2010

У меня есть каталог, содержащий кучу файлов, некоторые текстовые, некоторые двоичные, без согласованных имен. Я хочу найти и заменить строку только в текстовых файлах. Итак, я пошел с:

perl -i -pne 's#/some/text/to/replace#/replacement/text#' *

Удалите параметр -i, и вы увидите, что бинарные файлы перехватываются. Как мне изменить эту однострочную, чтобы пропустить двоичные файлы?

Ответы [ 2 ]

3 голосов
/ 17 августа 2010
ack -n --text --sort -f . | xargs perl -i -pne 's…'

Злоупотребление ack идет намного быстрее, чем написание собственного решения с -T.

2 голосов
/ 17 августа 2010

Ну, это все зависит от вашего определения текстового файла.В Perl 5 есть оператор -T filetest , который сообщит вам, является ли имя файла или дескриптор файла текстовым файлом (используя определение Perl 5):

perl -i -pne 'BEGIN{@ARGV=grep-T,@ARGV}s#regex#replacement#' *

Блок BEGIN будетотфильтруйте все файлы, которые не прошли тест -T, чтобы они даже не читались (за исключением их первого блока, потому что именно это -T использует, чтобы определить, являются ли они текстом).

Из perldoc -f -X

Переключатели -T и -B работают следующим образом.Первый блок файла или около того проверяется на наличие нечетных символов, таких как странные управляющие коды или символы с установленным старшим битом.Если найдено слишком много странных символов (> 30%), это файл -B;в противном случае это файл -T.Кроме того, любой файл, содержащий нулевой байт в первом блоке, считается двоичным файлом.Если в файловом дескрипторе используется -T или -B, то проверяется текущий буфер ввода-вывода, а не первый блок.И -T, и -B возвращают true для пустого файла или файла в EOF при тестировании файлового дескриптора.Поскольку для выполнения теста -T вы должны прочитать файл, в большинстве случаев вы хотите сначала использовать -f для файла, как в следующем, если только не -f $ file && -T $ file.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...