Як перетворити ^ M рядок рядків у 'нормальний' рядок у файлі, відкритому у vim?


481

vim показує на кожному рядку, що закінчується ^ M

Як я можу замінити це на "звичайний" рядок?



3
Будь ласка, змініть рішення на зміну формату файлів, оскільки це найчистіше рішення.
erikbwork

1
Я знаю, що це питання стосується vim, але деякі інші пошукові запити Google також розташовані в цій темі. Отже, якщо у вашій системі встановлено Eclipse, ви можете перетворити розділовий рядок для одного файлу або повного дерева папок з файлами кількома клацаннями: stackoverflow.com/a/7019737/1364747
Тедді

Мені подобається, як ви називаєте звичайні розриви рядків "нормальними" - на відміну від таких ^ М розривів рядків :-)
DerMike

Відповіді:


134

Це єдине, що працювало для мене:

: e ++ ff = dos

Знайдено за адресою: http://vim.wikia.com/wiki/File_format


Працював над 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>

^ М символів (Ctrl-V - це Vim спосіб запису символу Ctrl ^, а Ctrl-M пише M після регулярного виразу, в результаті чого ^ M спеціальний символ)

/\r/

з новим рядком ( \r)

g

І робити це у всьому світі (не лише перше явище на лінії).


21
він видалив ^ M символів, але не вставляє повернення каретки.
luckytaxi

14
@jumpnett - Вам потрібно натиснути клавіші Ctrl-V / Ctrl-M, а не вводити це як дослівний текст.
LeopardSkinPillBoxHat

33
Це, безумовно, правильна відповідь на питання, якщо у вас є ^ M, за яким слідує новий рядок, ви хочете зберегти новий рядок, але видалити ^ M. Виконайте іншу заміну нижче, ніж подвійний пробіл у вашому файлі.
dlamblin

12
Якщо ви все ще не вистачаєте повернення каретки (тобто ^ M видалено, але все загорнуто в один рядок), зробіть: :%s/<Ctrl-V><Ctrl-M>/\r/g(де \ M замінює ^ M на новий рядок).
Вільям Террелл

7
Якщо ви використовуєте Vim в Windows, вам потрібно буде використовувати <Ctrl-Q> замість <Ctrl-V>.
GrandAdmiral

418

У Linux та Mac OS працює наступне,

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

де ^V^Mозначає тип Ctrl+ V, то Ctrl+ M.

Примітка. У Windows, можливо, ви хочете використовувати ^Qзамість цього ^V, оскільки за замовчуванням ^Vвідображається вставка тексту.


3
Чому це отримало протизаконну заяву? Він працює навіть у тому випадку, коли ваш файл перетертий в один рядок, тому що він має неправильний кінець рядка.
Пол Томблін

2
Ні. Мій спосіб замінює будь-який кінець рядка у файлі правильним кінцем рядка.
Пол Томблін

7
Це інша проблема, коли у вашому файлі немає НЕ нових рядків, які, я вважаю, є більш поширеними. FYI ^ M можна
зіставити

12
Це глибоко загадкова команда, але вона працює для мене на mac.
Ерік Уокер

5
Я виявив, що еквівалент %s/\r/\r/gдобре працював на MacVim для файлу, що відображається лише ^Mв кінці рядків (один довгий рядок в умовах MacVim). Ясно означає, що в шаблоні та замінниках частини цієї команди різні речі.
RichVel

184

Всередині vimподивіться формат файлу - DOS або Unix:

:set filetype=unix

:set fileformat=unix

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


3
use: set fileformat = unix Для більшості конфігураційних файлів тип файлу змінює лише тип синтаксису, який використовується.
derGral

6
Це виправило помилку, яку я мав ... Вім почав думати, що мій файл у форматі UNIX - це вікна, а нещодавно змінені рядки показували ^ M у git diff.
Томас Хантер II

Повинно бути залежним від системи. Сьогодні цей працював. Команда set виконується в межах vim, btw.
gbarry

1
чудово! тому що файловий формат є dos, встановіть його на unix, і це нормально
zhaozhi

3
Це також працює на vi BTW, і ви можете зробити set ff=unixяк невеликий ярлик таким же чином, ftяк це ярликfiletype
Posva

110

Файл, який я створив за допомогою BBEdit, який бачив у MacVim, відображав купу ^Mповернень рядків замість звичайних. Наступна заміна рядка вирішила проблему - сподіваємось, це допоможе:

:%s/\r/\r/g

Це цікаво, тому що я замінюю перерви рядків тим самим символом, але, мабуть, Vim просто повинен отримати свіжий \ n для коректного відображення. Мені буде цікаво знати основні механізми, чому це працює.


1
Пошукові функції мають тенденцію приймати більш широкі правила розпізнавання послідовностей кінцевих рядків. Але це має специфічне значення, коли воно записується як дані.
gbarry

Це працювало для мене в Windows gVim, щоб розібрати файл, у якого не було розривів рядків, а просто ^ М замість цього.
спалах

2
З усіх рішень, запропонованих на цій сторінці, це була єдина модель, яка працювала для мене при видаленні ^ M з файлу CSV. Використання MacVim.
B6431

+1 працював і для мене під час SSHing до Ubuntu Trusty з Windows, використовуючи Mobaterm
Carl

Таким чином, це, здавалося, замінило всіх \rсимволів, \nнезважаючи на те, що вони вказали \rяк заміну. Не нарікаючи, це саме те, що я хотів. Просто дивно.
пончик

34

По-перше, використовуйте, :set ff?щоб визначити формат файлу, який ваш файл.

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

Просто введіть :e ++ff=dosу командному рядку Vim, щоб змінити формат вашого файлу з unix на dos. Це має вирішити проблему. Якщо ні, то вам :%s/\r//gслід допомогти.


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, тут ^ М символ, у пробіл, а потім видаляємо всі пробіли в кінці рядків (що для мене є бажаним результатом незалежно)

Вибачте за те, що я відновив старе питання, на яке вже давно відповіли, але, здавалося, виникає деяка плутанина, і я подумав, що допоможу очистити щось із цього питання, оскільки це дуже високий рівень пошуку Google.


1
натискання клавіші ctrl-v ctrl-m може працювати, щоб вставити символ, а також fwiw. але \ r - це те, що вставляє правильне повернення каретки.
Метаграф

1
Це ПРАВА відповідь. Як було сказано вище, використовуйте <ctrl-v> <ctrl-m>, щоб отримати буквальну ^ M, вставлену в команду.
carlosayam

1
Я погоджуюся, хоча я впевнений, що якби це працювало для мене під час оригінальної публікації, я б не розміщував. ;)
Метаграф

22

Жодне з них не працювало для мене, тому я спробував це, що спрацювало:

тип :%s/

натиснути CTRL-VCTRL-M

тип //g

натиснути Enter

Таким чином, загальна команда у Vim повинна виглядати :%s/^M//g

Що це робить: :%s(знайти та замінити) /^M/(цей символ) /(без символів) g(у всьому світі).


Удар !! Працює на Mac.
shamail


15

Без потреби використовувати Ctrl: :%s/\r$//


1
Це я і роблю. Я просто ніколи не пам'ятаю команду
піксель 67

Це рекомендований спосіб видалення цих закінчень.
Метаграф


12

Я зробив це з sed:

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


Ви впевнені, що це працює? На OSX: sed -e 's/\r/\n/g' <<< 'over and over'->oven and oven
Арман

Так, це працює (я його дуже багато використовую), але на 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 і все.


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
Дякую тобі! це
вирішило

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є прапором, що означає" глобально ", на відміну від першого появи в рядку.


7

Це працювало для мене:

  1. Встановити формат файлу на unix ( \nзакінчення рядка)
  2. збережіть файл

Отже, vim:

:set ff=unix
:w

1
Цей працював на мене, тоді як прийнята відповідь не відповіла.
Marcello Romani

7

У моєму випадку

Нічого вище не працювало, у мене був файл CSV, скопійований на Linux з мого Mac, і я використав усі вищезазначені команди, але нічого не допомогло, окрім нижньої

tr "\015" "\n" < inputfile > outputfile

У мене був файл, в якому ^ М символів були прокладені між рядками чимось на зразок нижче

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/ серед інших.



4

використовуйте утиліту dos2unix, якщо файл створений у Windows, використовуйте утиліту mac2unix, якщо файл створений на mac. :)


ніколи не чув про mac2unix раніше, я б знову звернувся, якби міг!
Куф

Хурай! це шлях!
Приватний



1

Щоб зберегти натискання клавіш , ви можете уникнути введення Ctrl+ VCtrl+ M, розмістивши це у відображенні. Просто відкрийте файл, що містить ^ М символ, витягніть його та вставте його у такий рядок у вашому .vimrc:

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

1

Жодна з цих пропозицій не працювала для мене, мені вдалося отримати навантаження ^Mрозривів рядків під час роботи з vim та eclipse. Я підозрюю, що зіткнувся із зовнішньою справою, але, якщо це допомагає комусь, що я робив.

:%s/.$//g

І це розібрало мою проблему


Це видалить будь-який символ у кінці рядка. Якщо у вас є рядок, який чомусь не закінчується ^ M, ви також видалите цей символ і був би несподіваним. Це не повинно бути так, але, якщо це так, і ви цього не знаєте, тоді ви можете перенести файл у дуже важкий спосіб ідентифікації.
Метаграф

1
:g/^M/s// /g

Якщо ви друкуєте з ^Mдопомогою Shift+6 Caps+Mвін не братиме.

Вам потрібно набрати ctrl+v ctrl+m.


1

^Mдає небажані розриви рядків. Щоб вирішити це, ми можемо використовувати sedкоманду наступним чином:

sed 's/\r//g'

idk, чому це було зменшено до -1 ... тому що він використовує sed? ви можете зробити ту ж заміну всередині vim, і це має спрацювати
Metagrapher

1

Просто видаліть set binaryу своєму .vimrc!


В іншому потоці рекомендується "встановити двійковий", щоб позбутися автоматичної вставки нового рядка.
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()

У цьому випадку, що поганого у використанні нативної команди * NIX dos2unix? linux.die.net/man/1/dos2unix
Metagrapher

0

Я провів південь, бореться з \ n ctrl-v 012 (обидва вони постачають мені null). & працював через цю нитку, поки я не дійшов до метаграфів.

\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), лібсан-звичайний: 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)

Магія. Я щиро вдячний

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.