Как преобразовать разрыв строки ^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
(Глобально).
Как насчет просто:
:%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,
Это сработало для меня:
- Установить формат файла в unix (
\n
конец строки) - сохранить файл
Итак, в 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>
Использовать 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'