Каков самый простой способ удалить все каретки с возвратом \r
из файла в Unix?
Удалить возврат каретки в 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