Вопрос

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

Это было полезно?

Решение

Я предполагаю, что вы имеете в виду возврат каретки (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

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

Другие советы

tr -d '\r' < infile > outfile

Видишь tr(1)

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

tr -d '\r' < filewithcarriagereturns > filewithoutcarriagereturns

Есть утилита под названием dos2unix он существует во многих системах и может быть легко установлен на большинстве из них.

Самый простой способ в Linux, по моему скромному мнению, это,

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

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

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

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

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

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

:%s/\r//g

или с

:1,$ s/^M//

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

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

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

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

Кто-нибудь еще порекомендует dos2unix и я тоже настоятельно рекомендую это сделать.Я просто сообщаю больше деталей.

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

yum install dos2unix

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

dos2unix fileIWantToRemoveWindowsReturnsFrom.txt

Вот в чем дело,

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

dos2unix fileName.extension fileName.extension

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

из файла fromdos

Если вы используете ОС (например, 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 введите имя в командной строке таким же образом, как и в других примерах.

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

#!/bin/bash

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

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

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

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

Просто используйте visual code в качестве замены notepad ++ в среде Linux, и все готово.

Я использовал для этого 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)

Хотя это более старый пост, недавно я столкнулся с такой же проблемой.Поскольку у меня были все файлы для переименования внутри /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

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

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

$ echo $(cat input) > output
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top