Как преобразовать конец строки Windows в конец строки Unix (CR / LF в LF) - PullRequest
65 голосов
/ 08 октября 2010

Я разработчик 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 в одинLF: отредактируйте файл с помощью vim, введите команду: set ff = unix и сохраните файл.Теперь перекодирование должно выполняться без ошибок.

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

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

Thankx =)

Ответы [ 8 ]

105 голосов
/ 08 октября 2010

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

73 голосов
/ 10 октября 2013

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

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

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

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

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

15 голосов
/ 19 августа 2014

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

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

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

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

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

tr -d '\ 15 \ 32' 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.

6 голосов
/ 26 мая 2017

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

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

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

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

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

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

6 голосов
/ 16 мая 2012

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

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

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

1 голос
/ 08 декабря 2010

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

#!/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
0 голосов
/ 08 октября 2010

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

...