Изменить:
Это оказалось проблемой кодирования - входные файлы OP - UTF16.
После обсуждения в комментариях, ОП копирует / вставляет данные из просмотра с помощью less
в пастинный блок: http://pastebin.com/uHmYmhpT
Это выглядело так:
<FF><FE>1^@^M^@
^@0^@0^@:^@0^@0^@:^@0^@9^@,^@4^@4^@2^@ ^@-^@-^@>^@ ^@0^@0^@:^@0^@0^@:^@1^@1^@,^@4^@4^@4^@^M^@
^@j& ^@W^@O^@K^@E^@ ^@U^@P^@^M^@
^@T^@H^@I^@S^@ ^@M^@O^@R^@N^@I^@N^@G^@ ^@j&^M^@
^@^M^@
^@2^@^M^@
... и т. Д.
Это явно не текстовый файл ascii (или utf8), и поэтому большинство стандартных инструментов (sed
, grep
, awk
и т. Д.) Не будут работать с ним.
<FF><FE>
в начале - это Порядок следования байтов , который указывает, что этот файл является текстом в кодировке UTF16. Существует стандартный инструмент для конвертации между UTF16 и UTF8, а UTF8 совместим с ascii для буквенно-цифровых символов, поэтому, если мы конвертируем его в UTF8, тогда sed
/ grep
/ awk
/ etc сможет его редактировать
Нам нужен инструмент iconv
. К сожалению, iconv
не имеет функции редактирования на месте, поэтому нам придется написать цикл, который использует временный файл для преобразования:
find . -type f -name '*.srt' -print0 | while read -d '' filename; do
if file "$filename"|grep -q 'UTF-16 Unicode'; then
iconv -f UTF16 -t UTF8 -o "$filename".utf8 "$filename" && mv "$filename".utf8 "$filename"
fi
done
Затем вы можете запустить команду find
/ sed
, чтобы ввести их в нижнем регистре. Большинство программ не заботятся о том, что ваши файлы теперь имеют формат UTF8, а не UTF16, но если у вас есть проблемы, вы можете написать аналогичный цикл, использующий iconv
, чтобы вернуть их обратно в UTF16 после того, как вы их в нижнем регистре.
Если вы хотите использовать строчные буквы для всех файлов, соответствующих '* .txt':
sed -i 's/.*/\L&/' *.txt
Но учтите, что при большом количестве TXT-файлов это может привести к проблемам с длиной командной строки.
Если вы хотите рекурсивно использовать нижний регистр для всех файлов, я бы использовал подход Диего - но есть пара ошибок, которые нужно исправить:
find . -type f -exec sed -i 's/.*/\L&/' {} +
должен сделать трюк.
Если вы не хотите, чтобы он был рекурсивным, вы хотите, чтобы он влиял только на файлы .txt
, и у вас слишком много файлов для работы sed ... *.txt
, тогда Применение:
find . -maxdepth 1 -type f -name '*.txt' -exec sed -i 's/.*/\L&/' {} +
(-maxdepth 1
останавливает рекурсию)
Старые версии find не будут поддерживать синтаксис -exec ... +
, поэтому если у вас возникнут проблемы с этим, замените +
на \;
. +
предпочтительнее, потому что он заставляет find
вызывать sed
с несколькими файлами на вызов, а не один раз на файл, поэтому он немного более эффективен.