^ M в конце каждой строки в vim


132

Когда я редактирую исходные файлы с помощью vim и других редакторов, иногда в конце строки я получаю эти символы ^ M в конце каждой строки. Я думаю, что это как-то связано с редактированием файла в Windows, а затем в Linux. Как я могу удалить все это автоматически?


18
Это потому, что Windows использует двухсимвольную последовательность (обычно пишется «\ r \ n») для обозначения разрыва строки, но UNIX / Linux использует только второй символ «\ n» для обозначения разрыва строки. Поэтому, когда вы редактируете текстовый файл Windows в редакторе Linux, редактор видит лишние символы, которые он не учитывает как часть разрывов строк, поэтому он пытается их отобразить, и в результате получается ^ M.
David Z

13
Есть еще кое-что, Дэвид. Vim с радостью отредактирует текстовый файл с окончанием строки DOS, не показывая все эти ^Mсимволы. Единственный признак у вас есть при редактировании текстового файла DOS в Vim, если у вас есть %{&ff}в вашей statuslineстоимости опциона. Vim показывает смешанный^M стиль окончания строки . Это означает, что вы использовали текстовый редактор, который не так сообразителен, как Vim, который не следовал существующему стилю окончания строки, как Vim по умолчанию. Если вы используете Vim или что-то еще такого же калибра в Windows, вы не получите таких окончаний строк.
Уоррен Янг

1
возможный дубликат Convert DOS line endings to Linux line
endings

Ответы:


128

В качестве команды введите

:%s/^M$//

(Чтобы получить ^ M, нажмите ^ V ^ M, где ^ - это CTRL на большинстве клавиатур)


62
также:% s / \ r $ // чтобы избежать
неприятностей

8
Или, спасая персонажа::%s/\r$
sehe 05

2
@sehe технически сохраняет 2 символа :)
Крис,

@glennjackman, ваш совет был намного проще, так как я изо всех сил пытался получить ^ V + ^ M, хотя этого вообще не было. Все, что я получал, - это содержимое в буфере обмена (поскольку ^ V действовал каждый раз, несмотря на мои неоднократные попытки получить их обе с разными стратегиями).
itsraghz

86

Один из простых способов вырезать окончания строк DOS - использовать ffопцию:

:set ff=unix
:wq

Теперь ваш файл вернулся к старому-доброму Unix-образу.

Если вы хотите добавить окончания строк DOS (чтобы принтер был доволен или передавайте файлы друзьям из Windows, у которых нет хороших инструментов), вы можете легко пойти в противоположном направлении:

:set ff=dos
:wq

8
vim не нашел ни ^ m, ни \ r, ни других окончаний строк, но это сработало. Спасибо :)
SgtPooki

2
Vim не нашел ни ^ M, ни \ r, но у меня это сработало! Спасибо @sarnold
7ochem

Казалось бы, git слишком тупой, чтобы обнаружить это как изменение одного символа. Я запустил это в Vim и git diffпоказывает, что каждая строка удалена и каждая строка добавлена: /
Tommy

Томми, это ограничение diff, а не ограничение git.
Spidey

34

Ты можешь сделать это:

:set fileformats=dos

Он скроет ^M's, не касаясь файла.


17

Есть программа под названием dos2unix, которая должна удалить их за вас. Windows использует разные символы окончания строки, поэтому так и происходит.


6

Это сработало для меня в файле, в котором все было в одной строке:

Сначала найдите все совпадения

:%s/^M//

(Чтобы получить ^M, нажмите ^ V ^ M, где ^ Ctrlна большинстве клавиатур)

Затем замените новой строкой

:%s//\r/g

Комбинированная команда будет:

:%s/^M/\r/g

Спасибо, интересно, как на самом деле ввести Ctrl-M в поиск-замену!
Робопрог 03


1

Причина проблемы могла быть в передаче по FTP. Когда вы отправляете эти файлы по FTP из одного ящика в другой, обязательно используйте передачу ASCII. Используйте команду «ASC».


0
" put this in your ~/.vimrc file and :source ~/.vimrc
" then you can do: Dos2Unix
" dos2unix ^M
fun! Dos2unixFunction()
    let _s=@/
    let l = line(".")
    let c = col(".")
    try
        set ff=unix
        w!
        "%s/\%x0d$//e
    catch /E32:/
        echo "Sorry, first save the file."
    endtry
    let @/=_s
    call cursor(l, c)
endfun
com! Dos2Unix keepjumps call Dos2unixFunction()

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.