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

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

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

38 ответов

Решение

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

: e ++ ff = dos

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

команда

:%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

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

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

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

где ^V^M означает набрать Ctrl + V, затем Ctrl + M.

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

В vim посмотрите на формат файла - DOS или Unix:

:set filetype=unix

:set fileformat=unix

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

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

:%s/\r/\r/g

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

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

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

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

Для того, чтобы символ ^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.

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

тип :%s/

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

тип //g

нажмите Enter

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

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

^M получается с помощью Ctrl+V и M, так что

s/^M//g

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

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

dos2unix   filename

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

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

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

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

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

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

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

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

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

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

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

Итак, в VIM:

:set ff=unix
:w

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

sed s/^M//g file1.txt > file2.txt

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

Я знаю, что это может быть слишком старым, но надеюсь, что кто-то может найти это полезным.

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

:%s/\r//g

Или же

:%s/\r\(\n\)/\1/g

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

В командном режиме в VIM:

:e ++ff=dos | setl ff=unix | up

e ++ff=dos - принудительно открыть файл в dos формат.

setl ff=unix - конвертировать файл в unix формат.

up - сохранять файл только тогда, когда он был изменен.

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

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

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

:% s/\r\n/\r

Использовать sed на MacOS сделайте это:

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

Пояснение: $'STRING' синтаксис здесь относится к оболочке bash. Маки не лечат \r как особый характер. Цитируя командную строку в $'' вы говорите, чтобы заменить оболочку \r с фактическим \r символ, указанный в стандарте ANSI-C.

:g/^M/s// /g

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

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

В Solaris:

:%s /// g

то есть:

:%s / ^M // г

Это означает:

  • % = все строки,
  • s = заменить,
  • ^M = то, что вы хотите заменить
  • // = заменить ничем
  • g = глобально (не только первое появление)

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

:%s/.$//g

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

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

sed 's/\r//g'

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

Другие вопросы по тегам