Що таке `^ M` і як я можу його позбутися?


134

Коли я відкриваю файл vim, я бачу дивні ^Mсимволи.

На жаль, улюблена у світі пошукова система не справляється зі спеціальними символами в запитах, тому я прошу тут:

  • Що це за ^Mперсонаж?

  • Як воно могло потрапити туди?

  • Як я його позбудуся?


3
Властиміль, що це було безглуздим редагуванням. Отриманий належний минулий час отримання англійської англійської мови.
Jesse_b

1
Це символ диграф управління, для отримання додаткової інформації: help digraph-table.
Ерік Лещинський

Відповіді:


107

Характер ^Mвантажу-повернення. Якщо ви бачите це, ви, ймовірно, дивитесь на файл, що виник у світі DOS / Windows, де кінцевий рядок позначений парою повернення / нової лінії перевезення, тоді як у світі Unix, кінець рядка позначений одним новим рядком.

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

У цій статті йдеться про те, як налаштувати vim для прозорого редагування файлів різними маркерами кінцевих рядків.

Якщо у вас є файл із ^Mкінцем деяких рядків і ви хочете їх позбутися, використовуйте це у Vim:

:s/^M$//

(Натисніть Ctrl+ V Ctrl+, Mщоб вставити це ^M.)


11
Спробуйте :%s/^M/\r/gзамість цього видалити ^Mта замінити ^Mсимвол нового рядка \r. Без %цього команда застосовується лише для поточного рядка. І я натрапив на кілька прикладів, коли ^Mне в кінці рядка, наприклад,The first line.^MThe second line.
Джордж

Або якщо ви не хочете безлічі перерв лінії, ви можете просто зробити:%s/^M/
pažnow1

2
Якщо це просто повернення вагона самостійно, це може бути класичний (до Unix) розрив лінії Macintosh. Навіть деякі новіші програми, такі як Excel 2007 для Mac, роблять це чомусь.
судо

@larsks Але altap.cz/salamander/help/salamand/appendix_txtfiles говорить, що ^Mвикористовується в UNIX
Vivek

У статті, з якою ви пов’язані, йдеться про те, що \nвикористовується в Unix, що є правильним. Це код ASCII 10, інакше відомий як ^J.
larsks

39

Більшість операційних систем UNIX має утиліту, яка називається, dos2unixщо перетворить CRLF в LF. Інші відповіді стосуються питання "що вони".


36

Простіший спосіб зробити це - скористатися такою командою:

dos2unix filename

Ця команда працює і з візерунками шляху, напр

dos2unix path/name*

Якщо це не працює, спробуйте використовувати інший режим:

dos2unix -c mac filename
  • -cВстановити режим перетворення. Де CONVMODE є одним з: ascii, 7bit, iso, macз asciiпо - замовчуванням.

22

Це працювало для мене

:e ++ff=dos 

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

тоді

:set ff=unix 

і, нарешті

:wq 

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"

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

У мене був файл, у якому ^ М символів були прокладені між рядками чимось на зразок нижче

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

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

ось коли dos2unix fileдопомагає


Ця відповідь не приносить нічого нового, does2unix вже згадується принаймні у двох відповідях набагато старше.
Rui F Ribeiro
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.