Перетворити закінчення рядків DOS в кінці рядків Linux у vim


717

Якщо я відкрию файли, створені в Windows, всі рядки закінчуються ^M.
Як я можу видалити цих символів відразу?


Якщо ви зробите це hexdump -C badfileі бачите 0x0d 0x0a "\r\n", це ваша проблема.
Ізмір Рамірес

Відповіді:


1074

dos2unix - це утиліта командного рядка, яка зробить це, або :%s/^M//gякщо ви використовуєте Ctrl- v Ctrl- mдля введення ^ M, або ви можете, :set ff=unixі vim зробить це за вас.

Документи в налаштуваннях "файловий формат" є тут , а у Вікі-вікі є вичерпна сторінка на рядку, що закінчує перетворення .

Крім того, якщо ви переміщуєте файли багато і назад, ви, можливо, не захочете їх конвертувати, а скоріше робити :set ff=dos, тому vim дізнається, що це DOS-файл, і використовуватиме конвенції DOS для закінчень рядків.


56
:%s/^M//gповинно бути :%s/\r//g, тому що ^Mпросто означає "відповідати капіталу" М "на початку рядка".
Буник

78
Якщо ви не зробите так, як сказано у відповіді, та "використовуйте ctrl-v ctrl-m для введення ^ M".
pjz

2
crtl-v - це не добре, у Windows він вставляє вміст буфера обміну до командного рядка. Рішення :%s/\r//gпрацювало для мене, ура @Bunyk
roblogic

3
@ropata Те, що ви хочете в Windows, це ctrl-q .
ruffin

2
Мені, мабуть, чогось set ff=unixне вистачає, бо нічого не робить. Можливо, він перетворює файл, але всі ^Mсимволи все ще є.
фельдшер

276

Змінення закінчень рядків у поданні:

:e ++ff=dos
:e ++ff=mac
:e ++ff=unix

Це також може бути використане як збереження операції (: w тільки не збережеться за допомогою закінчень рядків, які ви бачите на екрані):

:w ++ff=dos
:w ++ff=mac
:w ++ff=unix

І ви можете використовувати його з командного рядка:

for file in *.cpp
do 
    vi +':w ++ff=unix' +':q' "$file"
done

4
Дуже дякую. Я спробував vi + ': wq ++ ff = unix' <filepath> для ледачого, як я.
a_secenthusiast

2
Це має бути найбільш схваленою відповіддю. :w +ff=unixнастільки приємніше, ніж більшість інших матеріалів, написаних тут, і сценарій bash - приємний бонус.
mkasberg

Ці :eкоманди не з'являються , щоб зробити що - небудь на моєму Windows , VIM установки. Мій погляд все ще показує ^Mкоди.
Грант Бірхмайер

160

Я зазвичай використовую

:%s/\r/\r/g

що здається трохи дивним, але працює завдяки тому, що vim відповідає linefeeds. Мені також легше запам’ятати :)


9
Це працює на всіх платформах. Тут найкраща відповідь.
thebigjc

4
Я ніколи не мав жодних проблем із цим :set ff=unixраніше, але файл, який я відкрив сьогодні, мабуть, був особливо дивним. Вім сказав, що це вже було, fileformat=unixале всі закінчення рядка були ^M. Це рішення спрацювало на мене.
Кріс Б

15
Це рішення додає для мене небажані зайві рядки, подвоюючи кількість рядків у файлі. :%s/\r//gнатомість працює на мене.
Віктор Заманян

3
Вікторе, ваші файли, ймовірно, мають \ r \ n закінчення. \ r не читається як новий рядок, але \ n є. У файлах, у які я працюю, є \ r, і ви повинні додати символ нового рядка.
Joeyjoejoejr

2
@ VictorZamanian's :%s/\r//g- єдине рішення загального призначення - особливо для файлів із змішаним режимом, що містять неоднорідну домішку як нових стилів DOS, так і UNIX. Канонічні рішення (наприклад, :set ff=unix, :e ++ff=unix) приймають на себе кожен рядок кінця поточного буфера в тому ж стилі нового рядка. Іноді це роблять; іноді цього не роблять. Cue sadface.
Сесіль Керрі,

97

Я вважаю за краще використовувати таку команду:

:set fileformat=unix

Ви також можете використовувати macабо dosвідповідно конвертувати файл у macintosh або MS-DOS / MS-Windows. І нічого не робить, якщо файл уже в правильному форматі.

Для отримання додаткової інформації див. Довідку vim:

:help fileformat

1
Здається, що ця команда нічого не робить у Windows vim. У моєму погляді досі є особливості ^M.
Грант Бірхмайер

Додавання set fileformat=unixдо мого .vimrc-файлу працювало.
Joey Allen

20

:set fileformat=unix конвертувати з dos в unix.


1
Це фактично вирішило проблему для мене. Я не зміг знайти цих персонажів під час пошуку.
Капітан Інсанео

20
:%s/\r+//g

У Vim ця смужка повертає всі каретки та залишає лише нові рядки.


2
Чомусь вище не працювало для мене під windows gvim. Але при зміні на :%s/\r//gнього спрацювало як шарм.
солтиш

1
@soltysh:% s / \ r \ + $ // g
мислитель3

14

+1 для вказівки на офіційний сайт doc. Для всіх, хто використовує вищезазначене посилання, див. Розділ "Перетворення поточного файлу" на цій сторінці.
Олов'яний чоловік

Цей + vim -b <ім'я файлу> працював як шарм, дякую, +1
Ян Молак

10

Перетворення каталогу файлів з dos в Unix

Використовуючи командний рядок і sed, знайдіть усі файли в поточному каталозі з розширенням ".ext" та видаліть усі "^ M"

@ https://gist.github.com/sparkida/7773170

find $(pwd) -type f -name "*.ext" | while read file; do sed -e 's/^M//g' -i "$file"; done;

також, як згадувалося вище ^ M = Ctrl+V+ Ctrl+M(не просто набирайте символ "^" каретки та M)


9

dos2unix може безпосередньо змінювати вміст файлу.

Ви можете безпосередньо використовувати його у файлі, не потребуючи тимчасового перенаправлення файлу.

dos2unix input.txt input.txt

Вище описане використовує передбачувану американську клавіатуру. Використовуйте -опцію 437 , щоб використовувати клавіатуру Великобританії.

dos2unix -437 input.txt input.txt



6

За допомогою наступної команди:

:%s/^M$//g 

Отримати ^Mз'явиться тип CtrlVтоді CtrlM. CtrlVговорить Віму приймати наступного символу, введеного буквально


6

Коментар щодо того, щоб з'явити ^ М на появу, - це те, що працювало для мене. Просто набравши "^ М" у моєму ві, нічого не було (не знайдено). CTRL+ V CTRL+M це зробила прекрасно.

Моя робоча команда підстановки була

:%s/Ctrl-V Ctrl-M/\r/g

і це виглядало так на моєму екрані:

:%s/^M/\r/g

4
Ви можете використовувати :%sзамість :1,$s. %це скорочення для 1,$.
Олов'яний чоловік

5

Я знайшов дуже простий спосіб: відкрийте файл з nano: nano file.txt

Натисніть CTRL+, Oщоб зберегти, але перед натисканням Enterнатисніть: ALT+, Dщоб переключити між кінцями рядків DOS та Unix / Linux, або: ALT+, Mщоб переключити між кінцями рядків Mac та Unix / Linux, а потім натисніть Enterдля збереження та CTRL+ Xдля виходу.


робив це на сервері Linux, у файлі були ^Mзакінчення. зберегти як дос, щоб зберегти, зберегти як Linux для видалення. можна перевірити, використовуючиcat -v
HattrickNZ

Це питання стосується vim, а не нано.
Грант Бірхмайер

5
:g/Ctrl-v Ctrl-m/s///

CtrlM- символ \r, або повернення каретки, до якого додаються закінчення рядка DOS. CtrlVвказує vim вставити буквальний CtrlMсимвол у командному рядку.

В цілому ця команда замінює всіх \rнічим, видаляючи їх з кінців рядків.



3

Можна використовувати таку команду:
:%s/^V^M//g
де '^' означає CTRLключ використання .


2

нижче команда використовується для переформатування всіх .sh-файлів у поточному каталозі, я перевірив його на своїй Fedora OS.

for file in *.sh; do awk '{ sub("\r$", ""); print }' $file >luxubutmp; cp -f luxubutmp $file; rm -f luxubutmp ;done

2

In vim введіть:

:w !dos2unix %

Це передасть вміст вашого поточного буфера команді dos2unix і запише результати над поточним вмістом. Vim попросить перезавантажити файл після


2

Для запуску безпосередньо в консоль Linux: vim file.txt +"set ff=unix" +wq


1

Зазвичай є dos2unixкоманда, яку ви можете використовувати для цього, просто переконайтеся, що ви прочитали посібник, оскільки версії GNU та BSD відрізняються тим, як вони поводяться з аргументами.

Версія BSD:

dos2unix $FILENAME $FILENAME_OUT
mv $FILENAME_OUT $FILENAME

Версія GNU:

dos2unix $FILENAME

Крім того, ви можете створити свій власний dos2unixз будь-яким із запропонованих тут відповідей, наприклад:

function dos2unix(){
    [ "${!}" ] && [ -f "{$1}" ] || return 1;

    { echo ':set ff=unix';
      echo ':wq';
    } | vim "${1}";
}

1

Я знав, що десь це бачив. Ось парада для входу в FreeBSD:

Потрібно видалити всі ці ^ М символи з файлу DOS? Спробуйте

tr -d \\r < dosfile > newfile
    -- Originally by Dru <genesis@istar.ca>

0

Хоча ця тема дуже стара, я хотів би поставити ще один матеріал із Вікії:

%s/\r\+$//g

які заповнюють знайдіть усі знаки повернення каретки (одне і більше повторень) до кінця рядка та видаліть, тому просто \nзалишатиметься в eol.


0

Це мій шлях. Я відкрив файл в dos EOL і коли я збережу файл, який автоматично перетвориться на unix EOL

autocmd BufWrite * :set ff=unix

0

якщо ви створите файл у NotePad або NotePad ++ у Windows, перенесіть його в Linux і відкриєте його vim, ви побачите ^ M в кінці кожного рядка. Щоб видалити це,

На своєму терміналі Linux введіть

dos2unix filename.ext

Це зробить необхідну магію.


0

Я хотів нових рядків замість ^ М. Перл на допомогу:

perl -pi.bak -e 's/\x0d/\n/g' excel_created.txt

Або написати в stdout:

perl -p -e 's/\x0d/\n/g' < excel_created.txt
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.