Как преобразовать разрыв строки ^ M в «нормальный» перевод строки в файле, открытом в vim?


481

vim показывает на каждой строке, заканчивающейся ^ M

Как я могу заменить это «нормальным» переводом строки?


Возможный дубликат
Концов

3
Пожалуйста, измените решение на изменение формата файла, потому что это самое чистое решение.
erikbwork

1
Я знаю, что этот вопрос касается vim, но некоторые другие поисковые запросы Google также попадают в эту ветку. Итак, если у вас установлен Eclipse в вашей системе, вы можете преобразовать разделитель строк для одного файла или целого дерева папок файлов несколькими щелчками
Тедди

Мне нравится, как вы называете нормальные разрывы строк "нормальными" - в отличие от этих разрывов строк ^ M :-)
DerMike

Ответы:


134

Это единственное, что сработало для меня:

: e ++ ff = dos

Нашел по адресу: http://vim.wikia.com/wiki/File_format


Работал на windows7 Vim7.4
schuess

19
:e ++ff=dosзатем :set ff=unixпреобразует окончания в нормальный формат.
Матеин Улхак

Ответ решения не работал для меня, мне помогли только команды @MateenUlhaq.
Иденшоу

577

команда

:%s/<Ctrl-V><Ctrl-M>/\r/g

Где <Ctrl-V><Ctrl-M>означает тип Ctrl+, Vто Ctrl+ M.

объяснение

:%s

заменитель,% = все строки

<Ctrl-V><Ctrl-M>

Символы ^ M (Ctrl-V - это способ записи символа Ctrl ^ в Vim, а Ctrl-M записывает M после регулярного выражения, в результате чего получается специальный символ ^ M)

/\r/

с новой строкой ( \r)

g

И сделать это глобально (не только первое вхождение на линии).


21
он удалил символы ^ M, но не вставляет возврат каретки.
luckytaxi

14
@jumpnett - Вам нужно нажать клавиши аккордов Ctrl-V / Ctrl-M, а не вводить это как дословный текст.
LeopardSkinPillBoxHat

33
Это, безусловно, правильный ответ на вопрос, если у вас есть ^ M, за которым следует новая строка, вы хотите сохранить новую строку, но удалите ^ M. Выполнение другой подстановки под двойным пробелом в вашем файле.
Дламблин

12
Если вам по-прежнему не хватает возврата каретки (то есть ^ M был удален, но все перенесено в одну строку), выполните: :%s/<Ctrl-V><Ctrl-M>/\r/g(где \ r заменяет ^ M новой строкой).
Уильям Туррелл

7
Если вы используете Vim в Windows, вам нужно использовать <Ctrl-Q> вместо <Ctrl-V>.
Гранд-адмирал

418

В Linux и Mac OS работает следующее:

:%s/^V^M/^V^M/g

где ^V^Mозначает тип Ctrl+ V, затем Ctrl+ M.

Примечание: в Windows вы, вероятно, захотите использовать ^Qвместо ^V, так как по умолчанию ^Vотображается для вставки текста.


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

2
Нет. Мой способ заменяет любой конец строки в файле на правильный конец строки.
Пол Томблин

7
Это связано с другой проблемой, когда в вашем файле НЕТ новых строк, что, как я признаю, более распространено. К вашему сведению ^ M может соответствовать \ r
dlamblin

12
Это очень загадочная команда, но она работает для меня на Mac.
Эрик Уокер

5
Я обнаружил, что аналог %s/\r/\r/gхорошо работает на MacVim для файла, отображаемого только ^Mв конце строк (одна длинная строка в терминах MacVim). Понятно, что \ r означает разные вещи в шаблоне против частей замены этой команды.
RichVel

184

В vim, взгляд на формат файла - DOS или Unix:

:set filetype=unix

:set fileformat=unix

Файл будет записан обратно без символов возврата каретки (CR, ^ M).


3
use: set fileformat = unix Для большинства конфигураций тип файла изменяет только используемый тип синтаксиса.
derGral

6
Это исправило ошибку, которую я имел ... Vim начал думать, что мой файл в формате UNIX был windows, а недавно измененные строки отображали ^ M в git diff.
Томас Хантер II

Должно быть системно-зависимым. Сегодня этот работал. Команда set выполняется в vim, кстати.
Гбарри

1
здорово! потому что формат файла - это dos, установите его как unix, и это нормально
zhaozhi

3
Это также работает на vi BTW, и вы можете сделать так, set ff=unixкак маленький ярлык точно так же, как ftярлык дляfiletype
Posva

110

Файл, который я создал с помощью BBEdit, который я видел в MacVim, отображал кучу ^Mвозвратов строк вместо обычных. Следующая строка заменяет решенную проблему - надеюсь, это поможет:

:%s/\r/\r/g

Это интересно, потому что я заменяю разрывы строк тем же символом, но я полагаю, что Vim просто нужно, чтобы новый \ r отображался правильно. Мне было бы интересно узнать основную механику того, почему это работает.


1
У поисковых функций есть тенденция принимать более широкие правила для распознавания последовательностей конца строки. Но \ r имеет особое значение, когда он записывается как данные.
gbarry

Это помогло мне в Windows gVim отсортировать файл без разрывов строк, а просто с большим количеством ^ M.
вспышка

2
Из всех решений, предложенных на этой странице, это был единственный шаблон, который работал для меня при удалении ^ M из CSV-файла. Использование MacVim.
B6431

+1 У меня тоже работал, когда SSHing в Ubuntu Trusty из Windows, используя Mobaterm
Карл

Таким образом, это, казалось, заменило все \rсимволы, \nнесмотря на то, что указывалось \rкак замена Не жалуюсь, это именно то, что я хотел. Просто странно.
пончик

34

Во-первых, используйте, :set ff?чтобы выяснить формат файла вашего файла.

Я предполагаю, что это может быть unix, тогда проблема в том, что ваш файл был создан с fileformat=dosдобавлением «^ M ^ J» в конец строки, но читается с flieformat=unixудалением только «^ J» с конца строки, оставляя там «^ M».

Просто :e ++ff=dosвведите в командной строке Vim, чтобы изменить формат файла с Unix на DOS. Это должно решить проблему. Если нет, :%s/\r//gдолжен помочь вам.


3
Я должен был сделать оба. :e ++ff=dosзатем :set ff=unixи:w
Макс

29

для того, чтобы символ ^ M соответствовал, мне пришлось визуально выбрать его, а затем использовать команду «Копировать в буфер обмена» для его извлечения. Вы можете проверить это, выполнив поиск символа, прежде чем пытаться выполнить команду замены.

/^M

следует выбрать первую плохую строку

:%s/^M/\r/g

заменит все ошибочные ^ M на возврат каретки.

Это как функции в MacVim, который основан на gvim 7.

РЕДАКТИРОВАТЬ:

Снова возникла эта проблема на моем компьютере с Windows 10, на котором установлена ​​Ubuntu для Windows, и я думаю, что это вызывает проблемы с форматированием файлов для vim. В этом случае изменение ff на unix, mac или dos сделало только изменение ^ M на ^ J и обратно.

Решение в этом случае:

:%s/\r$/ /g
:%s/ $//g

Причина, по которой я пошел по этому пути, заключается в том, что я хотел убедиться, что у меня нет деструктивного файла. Я мог бы, :%s/\r$//gно это удалило бы возврат каретки прямо, и могло бы иметь неожиданные результаты. Вместо этого мы преобразуем единственный символ CR, здесь символ ^ M, в пробел, а затем удаляем все пробелы в конце строк (что для меня является желательным результатом независимо от)

Извините за возрождение старого вопроса, на который уже давно дан ответ, но, похоже, возникла некоторая путаница, и я подумал, что помогу прояснить кое-что из этого, так как это происходит в поисковой выдаче Google.


1
нажатие ctrl-v ctrl-m может также работать для вставки символа, fwiw. но \ r - это то, что вставляет правильный возврат каретки.
Метаграф

1
Это правильный ответ. Как сказано выше, используйте <ctrl-v> <ctrl-m>, чтобы вставить литерал ^ M в команду.
Карлосаям

1
Я согласен, хотя я уверен, что если бы это сработало для меня во время первоначальной публикации, то я бы не писал. ;)
Метаграф

22

Ни один из них не работал для меня, поэтому я попробовал это, который работал:

тип :%s/

Нажмите CTRL-VCTRL-M

тип //g

Нажмите Enter

Таким образом, общая команда в Vim должна выглядеть :%s/^M//g

Что это делает: :%s(найти и заменить) /^M/(этот символ) /(без символов) g(глобально).


Ударьте по !! Работает на Mac.
Шамаиль


15

Без необходимости использовать Ctrl: :%s/\r$//


1
Я тоже так делаю. Я просто никогда не помню команду
pixel 67

Это рекомендуемый способ удалить эти окончания.
Metagrapher


12

Я сделал это с помощью sed:

sed -i -e 's/\r/\n/g' filename


Вы уверены, что это работает? На OSX: sed -e 's/\r/\n/g' <<< 'over and over'->oven and oven
Armand

Да, это работает (я часто его использую), но в OSX, если у вас не установлена ​​GNU-версия sed, она может не работать. Версия sed, которую Apple поставляет по умолчанию, сильно отличается (к сожалению) от версии GNU, которая поставляется во всех дистрибутивах Linux. Проверьте ответ на этот вопрос для получения дополнительной помощи: stackoverflow.com/q/30003570/2062384
Freedom_Ben

Спасибо @Freedom_Ben. Похоже, что это работает для GNU, sedно не для BSD sed(как в OSX). Любой, кто исправляет разрывы строк, вероятно, работает с различными операционными системами, поэтому полезно знать, когда ответ будет работать.
Арманд

10

Как насчет просто: :%s/\r//g это полностью сработало для меня.

Это просто очистит конец строки всех строк, удалит ^ M и все.


9

Есть много других ответов на этот вопрос, но, тем не менее, мне лучше всего подходит следующее, так как мне нужно было решение для командной строки:

vim -u NONE -c 'e ++ff=dos' -c 'w ++ff=unix' -c q myfile

Объяснение:

  • Без загрузки каких-либо файлов .vimrc откройте myfile
  • Запустите, :e ++ff=dosчтобы принудительно перезагрузить весь файл как конец строки DOS.
  • Выполнить, :w ++ff=unixчтобы записать файл, используя конец строки Unix
  • Выйти из Vim

3
благодарю вас! это исправило мою проблему и оказалось полезным для использования в сценариях
Peddipaga

8

Ctrl+ Mминимизирует мое окно, но Ctrl+ Enterфактически вставляет ^Mсимвол. Я также должен был быть уверен, чтобы не отрывать Ctrlключ между нажатиями.

Таким образом, решение для меня было:

:%s/<Ctrl-V><Ctrl-Enter>/\r/g

Где <Ctrl-V><Ctrl-Enter>означает нажать и удерживать Ctrl , нажмите и отпустите V, нажмите и отпустите Enter, а затем отпустите Ctrl .

Если вы работаете над файлом, созданным Windows

Вышеупомянутое решение добавит дополнительную строку между существующими строками, потому что уже есть невидимая \rпосле ^M.

Чтобы предотвратить это, вы хотите удалить ^Mсимволы, не заменяя их.

:%s/<Ctrl-V><Ctrl-Enter>//g

Где %означает «в этом буфере», sозначает «заменить», « /означает» (найти) следующий шаблон, « <Ctrl-V><Ctrl-Enter>относится к клавишам, нажимаемым для получения ^Mсимвола (см. Выше), //означает« с пустым »(или,« с шаблоном » между этими двумя косыми чертами, который является пустым "), и gявляется флагом, означающим" глобально ", в отличие от первого вхождения в строке.


7

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

  1. Установить формат файла в unix ( \nконец строки)
  2. сохранить файл

Итак, в VIM:

:set ff=unix
:w

1
Этот сработал для меня, а принятый ответ - нет.
Марчелло Романи

7

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

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

5

В качестве альтернативы, есть утилиты с открытым исходным кодом, называемые dos2unix и unix2dos, которые делают именно это. В системе Linux они, вероятно, установлены по умолчанию; для системы Windows вы можете загрузить их с http://www.bastet.com/ среди других.



4

используйте утилиту dos2unix, если файл был создан в Windows, используйте утилиту mac2unix, если файл был создан на Mac. :)


никогда не слышал о mac2unix раньше, я бы снова поднял голос, если бы мог!
Куф

Huray! это путь!
Частное



1

Чтобы сохранить нажатия клавиш , вы можете избежать ввода Ctrl+ VCtrl+ M, поместив это в отображение. Просто откройте файл, содержащий символ ^ M, восстановите его и вставьте в строку, подобную этой, в вашем .vimrc:

nnoremap <Leader>d :%s/^M//g<CR>

1

Ни одно из этих предложений не сработало для меня, так как мне удалось получить множество ^Mразрывов строк при работе с vim и eclipse. Я подозреваю, что я столкнулся с внешним случаем, но в случае, если это помогает кому-то, кого я сделал.

:%s/.$//g

И это решило мою проблему


Это удалит ЛЮБОЙ символ в конце строки. Если у вас есть строка, которая по какой-то причине не заканчивается на ^ M, вы также удалите этот символ, что будет неожиданно. Это не должно иметь место, но в случае, если это так, и вы этого не знаете, тогда вы могли бы запятнать свой файл очень трудно идентифицировать способом.
Metagrapher


1

^Mдает нежелательные разрывы строк. Для этого мы можем использовать sedкоманду следующим образом:

sed 's/\r//g'

ИДК, почему это было понижено до -1 ... потому что он использует Sed? вы можете сделать такую ​​же замену внутри vim, и она должна работать
Metagrapher

1

Просто удалите set binaryв свой .vimrc!


В другом потоке было рекомендовано «установить двоичный файл», чтобы избавиться от автоматической вставки новой строки.
dexter2305

1

Чтобы использовать sedна MacOS, сделайте это:

sed -i.bak $'s/\r//' <filename>

Объяснение:$'STRING' синтаксис здесь относится к Баш оболочки. Маки не воспринимаются \rкак особые персонажи. Цитируя командную строку в ней, $''вы говорите оболочке заменить \rдействительный \rсимвол, указанный в стандарте ANSI-C.


0

«Эта функция сохраняет список переходов

fun! Dos2unixFunction()
let _s=@/
let l = line(".")
let c = col(".")
try
    set ff=unix
    w!
    "%s/\%x0d$//e
catch /E32:/
    echo "Sorry, the file is not saved."
endtry
let @/=_s
call cursor(l, c)
endfun
com! Dos2Unix keepjumps call Dos2unixFunction()

В этом случае, что не так с использованием собственной команды dos2unix * NIX? linux.die.net/man/1/dos2unix
Metagrapher

0

Я провел день, борясь с \ n ctrl-v 012 (оба из которых дают мне ноль). И работал через эту тему, пока я не достиг мета-фотографа.

\r работал нормально для меня!

/),/s/),/)\r/g

получилось примерно так:

дополнительный черный список: i386 (0.4.1, 0.4.1 + nmu1), libmount1: i386 (2.20.1-5.1, 2.20.1 -5.2), libblkid1: i386 (2.20.1-5.1, 2.20.1-5.2) , libapt-pkg4.12: i386 (0.9.7.4, 0.9.7.5), nmap: i386 (6.00-0.1, 6.00-0.2), libsane-common: i386 (1.0.22-7.3,

во что-то вроде этого:

26 libwv-1.2-4: i386 (1.2.9-3, автоматический)
27 openjdk-6-jre-headless: i386 (6b24-1.11.4-3, автоматический)
28 jed: i386 (0.99.19-2.1)

Магия. Я глубоко благодарен

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