Удалить возврат каретки в Unix

Каков самый простой способ удалить все каретки с возвратом \r из файла в Unix?

Ответ 1

Я предполагаю, что вы подразумеваете возврат каретки (CR, "\r", 0x0d) в конце строк, а не только слепо внутри файла (вы можете иметь их в середине строк для всех Я знаю). Используя этот тестовый файл с CR только в конце первой строки:

$ cat infile
hello
goodbye

$ cat infile | od -c
0000000   h   e   l   l   o  \r  \n   g   o   o   d   b   y   e  \n
0000017

dos2unix - это способ, если он установлен в вашей системе:

$ cat infile | dos2unix -U | od -c
0000000   h   e   l   l   o  \n   g   o   o   d   b   y   e  \n
0000016

Если по какой-либо причине dos2unix вам недоступно, тогда sed сделает это:

$ cat infile | sed 's/\r$//' | od -c
0000000   h   e   l   l   o  \n   g   o   o   d   b   y   e  \n
0000016

Если по какой-либо причине sed вам не доступно, то ed сделает это сложным образом:

$ echo ',s/\r\n/\n/
> w !cat
> Q' | ed infile 2>/dev/null | od -c
0000000   h   e   l   l   o  \n   g   o   o   d   b   y   e  \n
0000016

Если у вас нет каких-либо из этих инструментов, установленных на вашем ящике, у вас больше проблем, чем при попытке конвертировать файлы: -)

Ответ 2

tr -d '\r' < infile > outfile

См. tr (1)

Ответ 3

Старая школа:

tr -d '\r' < filewithcarriagereturns > filewithoutcarriagereturns

Ответ 4

Здесь есть утилита dos2unix, которая существует во многих системах и может быть легко установлена ​​на большинстве.

Ответ 5

Самый простой способ для Linux, по моему скромному мнению,

sed -i 's/\r$//g' <filename>

Сильные кавычки вокруг оператора подстановки 's/\r//' очень важны. Без них оболочка будет интерпретировать \r как escape + r, уменьшит ее до простого r и удалит все строчные буквы r. Поэтому ответ, данный Робом в 2009 году, не работает.

А добавление модификатора /g гарантирует удаление даже нескольких \r, а не только первого.

Ответ 6

sed -i s/\r// <filename> или somesuch; см. man sed или богатство информации, доступной в Интернете, относительно использования sed.

Одно замечание - это точный смысл "возврата каретки" в приведенном выше; если вы действительно имеете в виду единственный управляющий символ "возврат каретки", то приведенный выше рисунок правильный. Если вы имели в виду, в общем, CRLF (возврат каретки и фид строки, то есть как линейные каналы реализованы под Windows), тогда вы, скорее всего, захотите вместо \r\n заменить. Голые линейные каналы (newline) в Linux/Unix \n.

Ответ 7

Если вы являетесь пользователем Vi, вы можете открыть файл и удалить возврат каретки с помощью:

:%s/\r//g

или

:1,$ s/^M//

Обратите внимание, что вы должны набрать ^ M, нажав ctrl-v, а затем ctrl-m.

Ответ 8

Еще раз решение... Потому что всегда есть еще один:

perl -i -pe 's/\r//' filename

Это хорошо, потому что он на месте и работает во всех стилях unix/linux, с которыми я работал.

Ответ 9

Кто-то порекомендует dos2unix, и я настоятельно рекомендую его. Я просто предоставляю более подробную информацию.

Если установлено, перейдите к следующему шагу. Если он еще не установлен, я бы рекомендовал установить его с помощью yum, например:

yum install dos2unix

Затем вы можете использовать его как:

dos2unix fileIWantToRemoveWindowsReturnsFrom.txt

Ответ 10

Вот что,

%0d - символ возврата каретки. Чтобы сделать его совместимым с Unix. Нам нужно использовать следующую команду.

dos2unix fileName.extension fileName.extension

Ответ 11

попробуйте это, чтобы преобразовать файл dos в файл unix:

fromdos file

Ответ 12

Если вы используете ОС (например, OS X), у которой нет команды dos2unix, но есть интерпретатор Python (версия 2.5+), эта команда эквивалентна команде dos2unix:

python -c "import sys; import fileinput; sys.stdout.writelines(line.replace('\r', '\n') for line in fileinput.input(mode='rU'))"

Это обрабатывает оба именованных файла в командной строке, а также каналы и перенаправления, как и dos2unix. Если вы добавите эту строку в ваш файл ~/.bashrc(или эквивалентный файл профиля для других оболочек):

alias dos2unix="python -c \"import sys; import fileinput; sys.stdout.writelines(line.replace('\r', '\n') for line in fileinput.input(mode='rU'))\""

... в следующий раз, когда вы войдете в систему (или запустите source ~/.bashrc в текущем сеансе), вы сможете использовать имя dos2unix в командной строке так же, как в других примерах.

Ответ 13

Для UNIX... Я заметил, что dos2unix удалил заголовки Unicode из моего UTF-8 файла. В git bash (Windows) выглядит следующим образом script. Он использует sed. Обратите внимание, что он удаляет только возврат каретки на концах строк и сохраняет заголовки Unicode.

#!/bin/bash

inOutFile="$1"
backupFile="${inOutFile}~"
mv --verbose "$inOutFile" "$backupFile"
sed -e 's/\015$//g' <"$backupFile" >"$inOutFile"

Ответ 14

Если вы используете среду X и имеете правильный редактор (визуальный код студии), я бы выполнил рекомендацию:

Код Visual Studio: как показать окончание строки

Просто перейдите в правый нижний угол экрана, визуальный код студии покажет вам как кодировку файла, так и конец строки, за которым следует файл, просто с простым щелчком вы можете переключить это.

Просто используйте визуальный код в качестве замены для блокнота ++ в среде linux, и вы готовы к работе.

Ответ 15

Я использовал python для этого, здесь мой код;

end1='/home/.../file1.txt'
end2='/home/.../file2.txt'
with open(end1, "rb") as inf:
     with open(end2, "w") as fixed:
        for line in inf:
            line = line.replace("\n", "")
            line = line.replace("\r", "")
            fixed.write(line)

Ответ 16

Хотя это старый пост, недавно я столкнулся с той же проблемой. Поскольку у меня были все файлы для переименования внутри /tmp/blah_dir/, так как каждый файл в этом каталоге имел завершающий символ "/r" (с символом "?" В конце файла), так что делать это способом сценария было только о чем я мог думать.

Я хотел сохранить окончательный файл с тем же именем (без конечного символа). С sed проблемой было выходное имя файла, которое мне было необходимо, чтобы упомянуть что-то еще (что я не хотел).

Я пробовал другие варианты, как предложено здесь (не считая dos2unix из-за некоторых ограничений), но не сработало.

Наконец, я попытался с помощью "awk", который работал, где я использовал "\ r" в качестве разделителя, и взял первую часть:

Хитрость заключается в следующем:

echo ${filename}|awk -F"\r" '{print $1}'

Ниже приведен фрагмент сценария, который я использовал (где у меня все файлы имели "\ r" в качестве завершающего символа в пути /tmp/blah_dir/), чтобы исправить мою проблему:

cd /tmp/blah_dir/
for i in 'ls'
  do
    mv   $i     $(echo $i | awk -F"\r" '{print $1}')
done

Примечание: этот пример не очень точен, хотя и близок к тому, что я работал (упомяну здесь только для лучшего понимания того, что я сделал)

Ответ 17

Удаление \r в любой системе UNIX®:

Большинство существующих решений в этом вопросе специфичны для GNU и не будут работать на OS X или BSD; Приведенные ниже решения должны работать на многих других системах UNIX и в любой оболочке, от tcsh до sh, но все же работать даже на GNU/Linux.

Протестировано на OS X, OpenBSD и NetBSD в tcsh и на Debian GNU/Linux в bash.


С sed:

В tcsh в OS X следующий sed фрагмент можно использовать вместе с printf, поскольку ни sed, ни echo обрабатывать \r особым образом, как это делает GNU:

sed 'printf 's/\r$//g'' input > output

С tr:

Другой вариант - tr:

tr -d '\r' < input > output

Разница между sed и tr:

Похоже, что tr сохраняет отсутствие завершающей новой строки из входного файла, тогда как sed в OS X и NetBSD (но не в OpenBSD или GNU/Linux) вставляет завершающую новую строку в самом конце файла, даже если на входе отсутствует какой-либо конечный \r или \n в самом конце файла.


Тестирование:

Вот несколько примеров тестирования, которые можно использовать, чтобы убедиться, что это работает в вашей системе, используя printf и hexdump -C; альтернативно, od -c также можно использовать, если ваша система отсутствует hexdump:

% printf 'a\r\nb\r\nc' | hexdump -C
00000000  61 0d 0a 62 0d 0a 63                              |a..b..c|
00000007
% printf 'a\r\nb\r\nc' | ( sed 'printf 's/\r$//g'' /dev/stdin > /dev/stdout ) | hexdump -C
00000000  61 0a 62 0a 63 0a                                 |a.b.c.|
00000006
% printf 'a\r\nb\r\nc' | ( tr -d '\r' < /dev/stdin > /dev/stdout ) | hexdump -C
00000000  61 0a 62 0a 63                                    |a.b.c|
00000005
% 

Ответ 18

вы можете просто сделать это:

$ echo $(cat input) > output