Подтвердить что ты не робот

Как конвертировать конец Windows в конец строки Unix (CR/LF в LF)

Я разработчик 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 =)

4b9b3361

Ответ 1

Должна быть программа под названием dos2unix, которая будет фиксировать для вас окончание строк. Если он еще не находится в вашем Linux-окне, он должен быть доступен через диспетчер пакетов.

Ответ 2

sed не может соответствовать \n, потому что конечная новая строка удаляется до строка помещается в пространство шаблонов, но может соответствовать \r, поэтому вы можете преобразовать \r\n (dos) в \n (unix), удалив \r

sed -i 's/\r//g' file

Предупреждение: это изменит исходный файл

Однако вы не можете изменить это из unix EOL в dos или old mac (\ r). Больше показаний здесь:

Как заменить новую строку (\n) с помощью sed?

Ответ 3

Собственно, vim действительно позволяет то, что вы ищете. Введите vim и введите следующие команды:

:args **/*.java
:argdo set ff=unix | update | next

Первая из этих команд устанавливает список аргументов для каждого файла, соответствующего **/*.java, который является всеми файлами Java, рекурсивно. Вторая из этих команд делает следующее для каждого файла в списке аргументов, в свою очередь:

  • Устанавливает контуры строк в стиле Unix (вы уже знаете это)
  • Записывает файл, если он был изменен
  • Переход к следующему файлу

Ответ 4

Команда 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.

Ответ 5

Чтобы преодолеть

Ambiguous output in step `CR-LF..data'

Простое решение может заключаться в добавлении флага -f для принудительного преобразования.

Ответ 6

Я сделаю небольшое исключение для ответа на jichao. Вы можете делать все, о чем он просто говорил довольно легко. Вместо поиска \n просто найдите фид формы в конце строки.

sed -i 's/\r$//' ${FILE_NAME}

Чтобы перейти от unix back to dos, просто найдите последний символ в строке и добавьте в него фид формы. (Я добавлю -r, чтобы сделать это проще с регулярными выражениями grep.)

sed -ri 's/(.)$/\1\r/' ${FILE_NAME}

Теоретически, файл можно изменить на стиль mac, добавив код в последний пример, который также добавляет следующую строку ввода в первую строку, пока все строки не будут обработаны. Однако я не буду пытаться сделать этот пример.

Предупреждение: -i изменяет фактический файл. Если вы хотите создать резервную копию, добавьте строку символов после -i. Это переместит существующий файл в файл с тем же именем с добавленными вами символами.

Ответ 7

Вы попробовали 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

Ответ 8

Вернитесь в Windows, сообщите Eclipse об изменении кодировки в UTF-8, затем вернитесь в Unix и запустите d2u в файлах.