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

StackOverflow https://stackoverflow.com/questions/811193

  •  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

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

<Ол>
  • Установите формат файла в unix (\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>
    

    Надеюсь, это поможет!

    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top