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

481

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

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

ByteNirvana
источник
Возможный дубликат
Концов
3
Пожалуйста, измените решение на изменение формата файла, потому что это самое чистое решение.
erikbwork
1
Я знаю, что этот вопрос касается vim, но некоторые другие поисковые запросы Google также попадают в эту ветку. Итак, если у вас установлен Eclipse в вашей системе, вы можете преобразовать разделитель строк для одного файла или целого дерева папок файлов несколькими щелчками
Тедди
Мне нравится, как вы называете нормальные разрывы строк "нормальными" - в отличие от этих разрывов строк ^ M :-)
DerMike

Ответы:

134

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

: e ++ ff = dos

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

Pam
источник
Работал на 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

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

LeopardSkinPillBoxHat
источник
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 отображался правильно. Мне было бы интересно узнать основную механику того, почему это работает.

netpoetica
источник
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должен помочь вам.

chenxsan
источник
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.

Metagrapher
источник
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(глобально).

d -_- б
источник
Ударьте по !! Работает на Mac.
Шамаиль
17

^ M извлекается Ctrl+ Vи M, так что

s/^M//g
Эндрю Санки
источник
15

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

BHarman
источник
1
Я тоже так делаю. Я просто никогда не помню команду
pixel 67
Это рекомендуемый способ удалить эти окончания.
Metagrapher
13

Простая вещь, которая работала для меня

dos2unix   filename
Шахзеб Хан
источник
12

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

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

Freedom_Ben
источник
Вы уверены, что это работает? На 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 и все.

tonatiuhnb
источник
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является флагом, означающим" глобально ", в отличие от первого вхождения в строке.

CrannDarach
источник
7

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

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

Итак, в VIM:

:set ff=unix
:w
Stryker
источник
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/ среди других.

ConcernedOfTunbridgeWells
источник
5
sed s/^M//g file1.txt > file2.txt

где ^ M набирается одновременным нажатием 3 клавиш, ctrl + v + m

Голубой бриллиант
источник
4

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

Рамеш
источник
никогда не слышал о mac2unix раньше, я бы снова поднял голос, если бы мог!
Куф
Huray! это путь!
Частное
3

Используйте одну из этих команд:

:%s/\r//g

Или

:%s/\r\(\n\)/\1/g
Мухаммед Реда
источник
2

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

:% s/\r\n/\r
ContextSwitch
источник
1

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

nnoremap <Leader>d :%s/^M//g<CR>
agouge
источник
1

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

:%s/.$//g

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

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

Если вы печатаете ^Mс помощью, Shift+6 Caps+Mон не примет.

Вам нужно ввести ctrl+v ctrl+m.

Шраван Кумар
источник
1

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

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

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

falcucci
источник
В другом потоке было рекомендовано «установить двоичный файл», чтобы избавиться от автоматической вставки новой строки.
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()
SergioAraujo
источник
В этом случае, что не так с использованием собственной команды 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)

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

user1997684
источник