Пакетная строчная текстовых файлов содержимого - PullRequest
0 голосов
/ 19 февраля 2012

После получаса поиска ответа на этот вопрос я не могу придумать, как это сделать (без необходимости открывать каждый текстовый файл по отдельности, выбирать все, а затем использовать строчные буквы с помощью gedit. Я хотел бы быть возможность запуска скрипта, будь то по командной строке или предпочтительно для включения в nautilus-скрипты, так что если я выберу файлы в графическом интерфейсе и нажму правой кнопкой мыши на скрипты и строчные буквы, и это будет сделано. Я знаю, что tr может знать, как это сделать, но я не могу понять, как я могу превратить следующий вызов в tr '[:upper:]' '[:lower:]' < input.txt > output.txt Обычно, я бы изменил input.txt на * .txt и * .txt для вывода. TXT, но это не работает. Есть идеи?

Дополнительно: как только это решено, как адаптировать его для nautilus-скриптов? :]

Спасибо!

Ответы [ 3 ]

2 голосов
/ 19 февраля 2012

Изменить: Это оказалось проблемой кодирования - входные файлы 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 с несколькими файлами на вызов, а не один раз на файл, поэтому он немного более эффективен.

1 голос
/ 21 февраля 2012

Вы можете написать короткий скрипт для преобразования файлов вида " .txt" в " -lowered.txt":

#!/bin/bash
# lowerit.sh
in=$1
out=${in/.txt/-lowered.txt}
tr '[:upper:]' '[:lower:]' < $in > $out

Если вы хотите преобразовать несколько файлов,Вы не можете использовать output.txt для всех них, конечно.И вы не можете записать во входной файл - это урезает его.

Вы можете записать в промежуточный файл и переименовать его как второй шаг в конце.

Чтобы обработать несколько файлов, используйте find:

find . -name "*.txt" -exec ./lowerit.sh {} +
1 голос
/ 19 февраля 2012

Не проверял это, но я думаю, что это будет работать для рекурсивного поиска по каталогам, просмотра всех файлов и замены их содержимого их строчной версией:

...