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