Ответ 1
Должна быть программа под названием dos2unix
, которая будет фиксировать для вас окончание строк. Если он еще не находится в вашем Linux-окне, он должен быть доступен через диспетчер пакетов.
Я разработчик Java, и я использую Ubuntu для разработки. Проект был создан в Windows с Eclipse и использует кодировку CP1252.
Для преобразования в 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
У меня есть чаевые об этом и получите решение здесь: http://fvue.nl/wiki/Bash_and_Windows#Recode:_Ambiguous_output_in_step_.60data..CR-LF.27, и он говорит:
Преобразование окончаний строк из CR/LF в single LF: отредактируйте файл с помощью vim, введите команду: set ff = unix и сохраните файл. Перекодирование теперь должно выполняться без ошибок.
Приятно, но у меня много файлов для удаления символа CR/LF, я не могу открыть их, чтобы сделать это. Vi не предоставляет никаких параметров командной строки для операций bash.
sed можно использовать для этого? Как?
Thankx =)
Должна быть программа под названием dos2unix
, которая будет фиксировать для вас окончание строк. Если он еще не находится в вашем Linux-окне, он должен быть доступен через диспетчер пакетов.
sed не может соответствовать \n, потому что конечная новая строка удаляется до строка помещается в пространство шаблонов, но может соответствовать \r, поэтому вы можете преобразовать \r\n (dos) в \n (unix), удалив \r
sed -i 's/\r//g' file
Предупреждение: это изменит исходный файл
Однако вы не можете изменить это из unix EOL в dos или old mac (\ r). Больше показаний здесь:
Собственно, vim действительно позволяет то, что вы ищете. Введите vim и введите следующие команды:
:args **/*.java
:argdo set ff=unix | update | next
Первая из этих команд устанавливает список аргументов для каждого файла, соответствующего **/*.java
, который является всеми файлами Java, рекурсивно. Вторая из этих команд делает следующее для каждого файла в списке аргументов, в свою очередь:
Команда tr также может сделать это:
tr -d '\ 15\32' < winfile.txt > unixfile.txt
и должен быть доступен вам.
Вам нужно запустить tr из script, так как он не может работать с именами файлов. Например, создайте файл myscript.sh:
#!/bin/bash
cd ${1}
for f in `find -iname \*.java`; do
echo $f
tr -d '\15\32' < $f > $f.tr
mv $f.tr $f
recode CP1252...UTF-8 $f
done
Запуск myscript.sh Web обработает все java файлы в папке Web.
Чтобы преодолеть
Ambiguous output in step `CR-LF..data'
Простое решение может заключаться в добавлении флага -f
для принудительного преобразования.
Я сделаю небольшое исключение для ответа на jichao. Вы можете делать все, о чем он просто говорил довольно легко. Вместо поиска \n просто найдите фид формы в конце строки.
sed -i 's/\r$//' ${FILE_NAME}
Чтобы перейти от unix back to dos, просто найдите последний символ в строке и добавьте в него фид формы. (Я добавлю -r, чтобы сделать это проще с регулярными выражениями grep.)
sed -ri 's/(.)$/\1\r/' ${FILE_NAME}
Теоретически, файл можно изменить на стиль mac, добавив код в последний пример, который также добавляет следующую строку ввода в первую строку, пока все строки не будут обработаны. Однако я не буду пытаться сделать этот пример.
Предупреждение: -i изменяет фактический файл. Если вы хотите создать резервную копию, добавьте строку символов после -i. Это переместит существующий файл в файл с тем же именем с добавленными вами символами.
Вы попробовали python script от Брайана Маупина, найденного здесь? (Я немного изменил его, чтобы быть более общим)
#!/usr/bin/env python
import sys
input_file_name = sys.argv[1]
output_file_name = sys.argv[2]
input_file = open(input_file_name)
output_file = open(output_file_name, 'w')
line_number = 0
for input_line in input_file:
line_number += 1
try: # first try to decode it using cp1252 (Windows, Western Europe)
output_line = input_line.decode('cp1252').encode('utf8')
except UnicodeDecodeError, error: # if there an error
sys.stderr.write('ERROR (line %s):\t%s\n' % (line_number, error)) # write to stderr
try: # then if that fails, try to decode using latin1 (ISO 8859-1)
output_line = input_line.decode('latin1').encode('utf8')
except UnicodeDecodeError, error: # if there an error
sys.stderr.write('ERROR (line %s):\t%s\n' % (line_number, error)) # write to stderr
sys.exit(1) # and just keep going
output_file.write(output_line)
input_file.close()
output_file.close()
Вы можете использовать этот script с
$ ./cp1252_utf8.py file_cp1252.sql file_utf8.sql
Вернитесь в Windows, сообщите Eclipse об изменении кодировки в UTF-8, затем вернитесь в Unix и запустите d2u
в файлах.