it-swarm.com.ru

Как преобразовать конец строки 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, дать команду: установить ff = unix и сохранить файл. Теперь перекодировать должен запускаться без ошибок.

Хорошо, но у меня есть много файлов для удаления символа CR/LF, я не могу открыть каждый, чтобы сделать это. Vi не предоставляет никаких опций командной строке для операций bash. 

sed можно использовать для этого? Как ?

Спасибо =)

62
MaikoID

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

103
cHao

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

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

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

Тем не менее, вы не можете перейти с unix EOL на dos или старый mac (\ r). Больше чтений здесь:

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

71
Jichao

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

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

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

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

Команда tr также может сделать это:

tr -d '\ 15\32' <winfile.txt> unixfile.txt

и должен быть доступен для вас.

Вам нужно будет запустить tr из скрипта, так как он не может работать с именами файлов. Например, создайте файл 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.

8
KeithL

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

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

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

6
V_V

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

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

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

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

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

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

3
John Chesshir

Вы пробовали скрипт Питона Брайана Мопена, найденный здесь ? (Я немного изменил его, чтобы сделать его более общим)

#!/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's 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's 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()

Вы можете использовать этот скрипт с 

$ ./cp1252_utf8.py file_cp1252.sql file_utf8.sql
1
Anthony O.

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

0
Jonathan