Что такое `^ M` и как мне от него избавиться?

134

Когда я открываю файл vim, я вижу странные ^Mсимволы.

К сожалению, любимая в мире поисковая система не справляется со специальными символами в запросах, поэтому я спрашиваю здесь:

  • Что это за ^Mперсонаж?

  • Как он мог туда добраться?

  • Как мне от этого избавиться?

Кристоф Вурм
источник
3
Властимил это было бессмысленно редактировать. Получил правильное прошедшее время в британском английском.
Jesse_b
1
Это символ диграф управления, для получения дополнительной информации: help digraph-table.
Эрик Лещинский

Ответы:

108

Символ ^Mвозврата каретки. Если вы видите это, вы, вероятно, смотрите на файл, созданный в мире DOS / Windows, где конец строки отмечен парой возврата каретки / перевода строки, тогда как в мире Unix конец строки отмечен одной новой строкой.

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

В этой статье обсуждается, как настроить vim для прозрачного редактирования файлов с разными маркерами конца строки.

Если у вас есть файл ^Mв конце некоторых строк, и вы хотите избавиться от них, используйте это в Vim:

:s/^M$//

(Нажмите Ctrl+ V Ctrl+, Mчтобы вставить это ^M.)

larsks
источник
11
Попробуйте :%s/^M/\r/gвместо этого удалить ^Mи заменить ^Mсимвол новой строки \r. Без %, команда применяется только для текущей строки. И я наткнулся на несколько примеров , когда ^Mне является в конце строки, такие какThe first line.^MThe second line.
Джордж
Или, если вы не хотите много разрывов строк, вы можете просто сделать это:%s/^M/
carenownow1
2
Если это просто возврат каретки, то это может быть классический (до Unix) разрыв строки Macintosh. Даже некоторые новые программы, такие как Excel 2007 для Mac, делают это по некоторым причинам.
Судо
@larsks Но altap.cz/salamander/help/salamand/appendix_txtfiles говорит, что ^Mиспользуется в UNIX
Vivek
В статье, на которую вы ссылаетесь, говорится, что \nона используется в Unix, и это правильно. Это код ASCII 10, иначе известный как ^J.
Жаворонки
39

В большинстве операционных систем UNIX есть утилита dos2unix, которая преобразует CRLF в LF. Другие ответы охватывают вопрос «что они».

Аарон Браун
источник
36

Более простой способ сделать это - использовать следующую команду:

dos2unix filename

Эта команда также работает с шаблонами пути, например

dos2unix path/name*

Если это не работает, попробуйте использовать другой режим:

dos2unix -c mac filename
  • -cУстановите режим конвертации. Где CONVMODE является одним из: ascii, 7bit, iso, macс asciiпо - умолчанию.
AnonGeek
источник
22

Это сработало для меня

:e ++ff=dos 

Команда: e ++ ff = dos говорит Vim снова прочитать файл, форсируя формат файла dos. Vim удалит окончания строк только в CRLF и LF, оставив в буфере только текст каждой строки.

тогда

:set ff=unix 

и наконец

:wq 
Stryker
источник
3
Спасибо! это сработало для меня, но принятое решение не
помогло
Имеет отношение ffк формату файла? Как насчет ++ff?
KcFnMi
Команда: e ++ ff = dos говорит Vim снова прочитать файл, форсируя формат файла dos. Vim удалит окончания строк только в CRLF и LF, оставив в буфере только текст каждой строки.
Страйкер
10

Еще один способ избавиться от возврата каретки с помощью trкоманды.

У меня есть небольшой скрипт, который выглядит так

#!/bin/sh
tmpfile=$(mktemp)
tr -d '\r' <"$1" >"$tmpfile"
mv "$tmpfile" "$1"
Johan
источник
6

Вы можете очистить это с sed:

sed -e 's/^M$//' < infile > outfile

Хитрость в том, как правильно войти в каретку. Как правило, вам нужно набрать, C-v C-mчтобы ввести буквальный возврат каретки. Вы также можете иметь возможность работать с

sed -i.bak -e 's/^M$//' infile
Дейл Хагглунд
источник
2

Что это ^ М?
^ M - символ возврата каретки. Если вы видите это, вы, вероятно, смотрите на файл, созданный в мире DOS / Windows, где конец строки отмечен парой возврата каретки / перевода строки, тогда как в мире Unix конец строки отмечен одной новой строкой.

Как оно могло туда попасть?
Когда происходит изменение в формате файла.

Как мне от этого избавиться?
откройте ваш файл с

vim -b FILE_PATH

сохраните его следующей командой

:%s/^M//g
Прашант Кансе
источник
У вас есть опечатка в открывшемся фильре .
Матеуш Пиотровски
4
Этот ответ ничего не добавляет к другим ответам. Первый абзац является почти дословной копией принятого ответа. Данный код ничего не сохранит , а только удалит все символы возврата каретки из всех строк. И я не уверен, как открытие файла в двоичном режиме поможет здесь.
Дубу
2

В моем случае,

Ничто из вышеперечисленного не сработало, у меня был файл CSV, скопированный на компьютер Linux с моего Mac, и я использовал все вышеперечисленные команды, но ничего не помогло, кроме приведенного ниже

tr "\015" "\n" < inputfile > outputfile

У меня был файл, в котором символы ^ M были переключены между строк примерно так, как показано ниже

Audi,A4,35 TFSi Premium,,CAAUA4TP^MB01BNKT6TG,TRO_WBFB_500,Trico,CARS,Audi,A4,35 TFSi Premium,,CAAUA4TP^MB01BNKTG0A,TRO_WB_T500,Trico,
Вишванат говда к
источник
0

Вы можете использовать Vim в режиме Ex:

ex -bsc '%s/\r//|x' file
  1. -b двоичный режим

  2. % выбрать все строки

  3. s замена

  4. \r возврат каретки

  5. x сохранить и закрыть

Стивен Пенни
источник
0

Добавьте следующую строку в ваш ~ / .vimrc

command! Tounix :call Preserve('1,$s/^M//')

Затем, когда у вас есть файл с окончанием строки Windows, выполните команду «: Tounix».

Чарли Далсасс
источник
-1

В прошлом я видел, что даже файлы конфигурации не анализируются должным образом и жалуются на пробелы, но если вы vi и сделаете список установок, он не будет отображать пробелы, grep filename [[space]] покажет вам ^ M

вот когда dos2unix fileпомогает

Sriram
источник
Этот ответ ничего нового не принесет, действительно ли уже упоминается в двух ответах, гораздо более старых.
Руи Ф. Рибейро