Что такое '^M' и как я избавляюсь от него?

Это, кажется, старый добрый символ перевода страницы, описанный в man ascii как:

Oct   Dec   Hex   Char
------------------------------------------
014   12    0C    FF  '\f' (form feed)

(Не упомянутый там, но ^Lкод является теми же 12.)

Затем в bash любой из них должен работать:

grep -v $'^\f' file

grep -v $'^\cL' file

grep -v $'\x0C' file
149
10.11.2019, 14:35
12 ответов

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

Прочитайте эту статью для большего количества детали и также статью в Википедии для новой строки.

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

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

:s/^M$//

(Нажмите Ctrl+V Ctrl+M для вставки этого ^M.)

116
27.01.2020, 19:28
  • 1
    Попробовать :%s/^M/\r/g вместо этого удалить ^M и замена ^M с символом новой строки \r. Без %, команда запрашивает текущую строку только. И я столкнулся с некоторыми примерами где ^M не в конце строки, такой как The first line.^MThe second line. –  George 14.04.2015, 07:29
  • 2
    Или если Вы не хотите загрузки разрывов строки, Вы могли бы просто сделать :%s/^M/ –  carefulnow1 21.11.2016, 10:52
  • 3
    Если это - просто возврат каретки отдельно, который мог бы быть классиком (предварительный Unix) разрыв строки Macintosh. Даже некоторые более новые программы как Excel 2007 для Mac делают это по некоторым причинам. –  sudo 18.04.2017, 20:22
  • 4
    @larsks, Но altap.cz/salamander/help/salamand/appendix_txtfiles говорит это ^M используется в UNIX –  Vivex 16.02.2018, 09:23
  • 5
    статья, с которой Вы связались, говорит это \n используется в Unix, который корректен. Это - код ASCII 10, иначе известный как ^J. –  larsks 16.02.2018, 23:05

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

40
27.01.2020, 19:28

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

dos2unix filename

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

dos2unix path/name*

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

dos2unix -c mac filename
  • -c Режим преобразования набора. Где CONVMODE является одним из: ascii, 7bit, iso, mac с ascii быть значением по умолчанию.
40
27.01.2020, 19:28

Другой способ избавиться от возвратов каретки с tr команда.

У меня есть маленький сценарий, которые похожи на это

#!/bin/sh
tmpfile=$(mktemp)
tr -d '\r' <"$1" >"$tmpfile"
mv "$tmpfile" "$1"
11
27.01.2020, 19:28

Можно очистить это с sed:

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

Прием - то, как ввести возврат каретки правильно. Обычно необходимо ввести C-v C-m ввести литеральный возврат каретки. Можно также иметь в распоряжении работу sed с

sed -i.bak -e 's/^M$//' infile
7
27.01.2020, 19:28

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

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

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

vim -b FILE_PATH

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

:%s/^M//g
5
29.04.2021, 00:56

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

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

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

  3. s подстановка

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

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

3
28.07.2021, 14:40

В моем случае

Ничего из вышеперечисленного не сработало, у меня был 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,
2
20.08.2021, 13:28

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

:e ++ff=dos 

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

затем

:set ff=unix 

и наконец

:wq 
67
20.08.2021, 13:28

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

, когда файл dos2unix поможет

-2
20.08.2021, 13:28

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

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

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

0
20.08.2021, 13:28

Sed в -поместите решение без необходимости вводить специальный символ (вы можете скопировать это, и оно работает):

sed -i -e "s/\r//g" filename

Пояснение:

-i: in-place
-e: regular expression
\r: escaped carriage return
/g: replace globally
9
20.08.2021, 13:28

Теги

Похожие вопросы