Я разработчик Java и использую Ubuntu для разработки. Проект был создан в Windows с Eclipse, и он использует Windows-1252 кодировке .
Для преобразования в UTF-8 я использовал программу перекодирования :
find Web -iname \*.java | xargs recode CP1252...UTF-8
Эта команда выдает эту ошибку:
recode: Web/src/br/cits/projeto/geral/presentation/GravacaoMessageHelper.java failed: Ambiguous output in step `CR-LF..data
Я искал об этом и получил решение в Bash и Windows, Recode: неоднозначный вывод на шаге `data..CR-LF ', и он говорит:
Преобразование окончаний строк из CR / LF в один LF: отредактируйте файл с помощью Vim, дайте команду
:set ff=unix
и сохраните файл. Перекодировать сейчас должно пройти без ошибок.
Хорошо, но у меня много файлов, из которых нужно удалить символ CR / LF, и я не могу открыть каждый, чтобы это сделать. Vi не предоставляет никаких параметров для командной строки для операций Bash.
Можно ли использовать sed для этого? Как?
источник
recode
выдает эту ошибку при попытке перекодировать файл со смешанным кодированием новой строки dos (\r\n
- CRLF) и unix (\n
LF). К сожалениюfromdos
, ранее бинарный файл, в настоящее время является псевдонимом для перекодирования, в котором есть эта проблема.vim +ex_command_one +ex_command_two ... file
awk
ответах нет решения.Ответы:
Должна быть вызвана программа
dos2unix
, которая исправит за вас окончания строк. Если его еще нет на вашем компьютере с Linux, он должен быть доступен через диспетчер пакетов.источник
fromdos
- это просто псевдонимrecode
, и это приведет к ошибке OP, упомянутой в файлах со смешанным кодированием dos (\ r \ n - CRLF) и unix (\ n LF).dos2unix
Работает только универсально.find ./ -name "*.java" -exec dos2unix {} +
.sed не может соответствовать \ n, потому что завершающий символ новой строки удаляется до того, как строка помещается в пространство шаблона, но может соответствовать \ r, поэтому вы можете преобразовать \ r \ n (dos) в \ n (unix), удалив \ r
Предупреждение: это изменит исходный файл
Однако с помощью этого вы не можете перейти с unix EOL на dos или старый mac (\ r). Больше чтения здесь:
Как я могу заменить новую строку (\ n) с помощью sed?
источник
sed -i
изменится исходный файл ! Поскольку люди не ожидаютsed
такого поведения, здесь уместно предупреждение. Не многие люди знают,-i
поэтому они будут пытатьсяsed -i ... file > file2
и не ожидают, что исходный файл будет изменен.sed
варианты распознают нестандартную символьную последовательность\r
. В этом случае попробуйте использовать буквальный символ ctrl-M (во многих оболочках введите ctrl-V ctrl-M, чтобы получить буквальный управляющий символ).На самом деле vim позволяет то, что вы ищете. Введите vim и введите следующие команды:
Первая из этих команд устанавливает список аргументов для каждого сопоставления файлов
**/*.java
, то есть всех файлов Java, рекурсивно. Вторая из этих команд по очереди выполняет следующие действия с каждым файлом в списке аргументов:источник
dos2unix
в цикле for, но все же приятно знать, как это сделать в Vim!Команда tr также может сделать это:
и должен быть доступен вам.
Вам нужно будет запустить tr из скрипта, поскольку он не может работать с именами файлов. Например, создайте файл myscript.sh:
Запуск
myscript.sh
обработает все файлы java в текущем каталоге и его подкаталогах.источник
Я сделаю небольшое исключение из ответа Джичао. Вы действительно можете довольно легко сделать все, о чем он только что говорил. Вместо того, чтобы искать
\n
, просто ищите возврат каретки в конце строки.Чтобы перейти с unix обратно на dos, просто найдите последний символ в строке и добавьте к нему канал формы. (Я добавлю,
-r
чтобы упростить это с помощью регулярных выражений grep.)Теоретически файл можно изменить в стиле Mac, добавив код в последний пример, который также добавляет следующую строку ввода к первой строке, пока все строки не будут обработаны. Однако я не буду приводить здесь этот пример.
Предупреждение: -i изменяет фактический файл. Если вы хотите сделать резервную копию, добавьте после нее строку символов
-i
. Это переместит существующий файл в файл с тем же именем с вашими персонажами, добавленными в конец.источник
sed -i 's/$/\r/' ${FILE_NAME}
...-r
Вариант не является переносимым; если у тебяsed
его нет, может, попробуй-E
.Чтобы преодолеть
просто решением может быть добавление
-f
флага для принудительного преобразования.источник
Вы пробовали найти здесь скрипт Python Брайана Мопина ? (Я немного изменил его, чтобы сделать его более общим)
Вы можете использовать этот скрипт с
источник
Вернитесь в Windows, скажите Eclipse, чтобы он изменил кодировку на UTF-8, затем вернитесь в Unix и запустите
d2u
файлы.источник
fromdos
в 10.04, и это часть пакетаtofrodos
.