Как преобразовать разрыв строки ^M в «обычный» разрыв строки в файле, открытом в vim?
-
03-07-2019 - |
Вопрос
vim отображается в каждой строке, заканчивающейся ^M
Как мне заменить это «обычным» разрывом строки?
Решение
Это единственное, что сработало для меня:
: 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
, поскольку по умолчанию <=> сопоставляется для вставки текста.
В пределах 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.
Ничего из этого не помогло мне, поэтому я попробовал это, и это сработало:
type :%s/
нажмите CTRL-V CTRL-M
type //g
нажмите Enter
Таким образом, общая команда в Vim должна выглядеть так: :%s/^M//g
Что это делает: :%s
(найти и заменить) /^M/
(этот символ) /
(без символов) g
(глобально).
Без необходимости использовать Ctrl:
:%s/\r$//
Р>
Простая вещь, которая сработала для меня
dos2unix filename
Я сделал это с помощью sed:
sed -i -e 's/\r/\n/g' filename
^ M извлекается с помощью Ctrl + V и M , так что
s/^M//g
Как насчет просто:
:%s/\r//g
Это полностью сработало для меня.
Это просто очистит конец строки всех строк, удалит ^ M и все.
Ctrl + M минимизирует мое окно, но Ctrl + Enter фактически вставляет символ ^M
. Я также должен был быть уверен, что не нажимать клавишу Ctrl между нажатиями.
Так что решение для меня было:
:%s/<Ctrl-V><Ctrl-Enter>/\r/g
Где <Ctrl-V><Ctrl-Enter>
означает нажать и удерживать Ctrl , нажать и отпустить V , нажать и отпустить Enter , , а затем отпустите Ctrl .
Если вы работаете с файлом, сгенерированным Windows
Приведенное выше решение добавит дополнительную строку между существующими строками, поскольку после \r
.
%
.
Чтобы предотвратить это, вы хотите удалить символы s
без их замены.
:%s/<Ctrl-V><Ctrl-Enter>//g
Где /
означает " в этом буфере " //
означает " заменить, " g
означает " (найдите) следующий шаблон, " <=> относится к клавишам, нажимаемым для получения символа <=> (см. выше), <=> означает " ничто " (или " с шаблоном между этими двумя косыми чертами, который является пустым "), а <=> является флагом , означающим " глобально, Quot; в отличие от первого вхождения в строке.
Есть много других ответов на этот вопрос, но, тем не менее, мне лучше всего подходит следующий, поскольку мне нужно решение для командной строки:
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
Это сработало для меня:
<Ол>\n
конец строки) Так в vim.
:set ff=unix
:w
В моем случае
Ничто из вышеперечисленного не сработало, у меня был файл 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,
В качестве альтернативы, есть утилиты с открытым исходным кодом, называемые dos2unix и unix2dos, которые делают именно это. В системе Linux они, вероятно, установлены по умолчанию; для системы Windows вы можете загрузить их с http://www.bastet.com/ и других. р>
sed s/^M//g file1.txt > file2.txt
где ^ M набирается одновременным нажатием 3 клавиш, ctrl + v + m
используйте утилиту dos2unix, если файл был создан в Windows, используйте утилиту mac2unix, если файл был создан на Mac. :) Р>
Это сработало для меня:
:% s/\r\n/\r
Чтобы сохранить нажатия клавиш , вы можете не набирать Ctrl + V Ctrl + M поместив это в отображение. Просто откройте файл, содержащий символ ^ M, восстановите его и вставьте в строку, подобную этой, в вашем .vimrc:
nnoremap <Leader>d :%s/^M//g<CR>
Ни одно из этих предложений не помогло мне, так как мне удалось получить ^M
разрывы строк при работе с vim и eclipse. Я подозреваю, что столкнулся с внешним делом, но в случае, если это поможет кому-то, кому я помог.
:%s/.$//g
И это решило мою проблему
:g/^M/s// /g
Если вы введете ^M
с помощью Shift+6 Caps+M
, он не будет принят.
Вам нужно ввести ctrl+v ctrl+m
.
^M
дает нежелательные разрывы строк. Чтобы справиться с этим, мы можем использовать команду sed
следующим образом:
sed 's/\r//g'
Просто удалите set binary
в вашем .vimrc!
Используйте одну из этих команд:
:%s/\r//g
Или
:%s/\r\(\n\)/\1/g
"Эта функция сохраняет список переходов
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()
Я провел день, борясь с ctrl-v 012 (оба из которых дают мне ноль).и работал над этой веткой, пока не добрался до метаграфа.
\r
у меня сработало нормально!
/),/s/),/)\r/g
получилось примерно так:
черный список-extra: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 дней:i386 (0.99.19-2.1)
Магия.Я глубоко благодарен
Или вместо использования vim вы можете просто исправить разрывы строк с помощью этой команды
fromdos <filename.txt>
Надеюсь, это поможет!