Конвертируйте окончания строки DOS в окончания строки Linux в vim

717

Если я открываю файлы, созданные в Windows, все строки заканчиваются на ^M.
Как мне удалить этих персонажей сразу?

Берт Хекман
источник
Если вы делаете hexdump -C badfileи видите, 0x0d 0x0a "\r\n"что это ваша проблема.
Измир Рамирес

Ответы:

1075

dos2unix - это утилита командной строки, которая сделает это, или :%s/^M//g, если вы используете Ctrl-, v Ctrl- mдля ввода ^ M, или вы можете, :set ff=unixи vim сделает это за вас.

Документы по настройке 'fileformat' находятся здесь , и на vim wiki есть исчерпывающая страница о конверсиях, заканчивающихся строкой .

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

pjz
источник
56
:%s/^M//gдолжно быть :%s/\r//g, потому что ^Mпросто означает «совпадать с заглавной буквы« М »в начале строки».
Bunyk
78
Нет, если вы делаете, как говорится в ответе, и «используйте ctrl-v ctrl-m для ввода ^ M».
2013 года
2
crtl-v не годится, в windows он вставляет содержимое буфера обмена в командную строку. Решение :%s/\r//gсработало для меня, ура @Bunyk
roblogic
3
@ropata То, что вы хотите в Windows, это ctrl-q .
ruffin
2
Я должен что-то упустить, потому set ff=unixчто ничего не делает. Может быть, он преобразует файл, но все ^Mсимволы все еще там.
felwithe
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 соответствует переводам строки. Мне тоже легче запомнить :)


источник
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) принимают на себя каждую строку конца текущего буфера в том же стиле новой строки. Иногда они делают; иногда они этого не делают. Кий грустный.
Сесил Карри
97

Я предпочитаю использовать следующую команду:

:set fileformat=unix

Вы также можете использовать macили dosдля преобразования вашего файла в формат Macintosh или MS-DOS / MS-Windows. И это ничего не делает, если файл уже в правильном формате.

Для получения дополнительной информации см. Справку vim:

:help fileformat
Сильвен Дефресне
источник
1
Эта команда, похоже, ничего не делает в моем Windows vim. На мой взгляд все еще есть ^Mсимволы.
Грант Бирчмайер
Добавление set fileformat=unixв мой файл .vimrc сработало.
Джои Аллен
20

:set fileformat=unix конвертировать из DOS в Unix.


источник
1
Это фактически решило проблему для меня. Я не смог найти этих персонажей во время поиска.
Капитан Инсанео
20
:%s/\r+//g

В Vim это удаляет все возвраты каретки и оставляет только новые строки.

Меркуцио
источник
2
По какой-то причине выше не работал у меня под windows gvim. Но когда изменился, :%s/\r//gэто работало как шарм.
солтыш
1
@soltysh:% s / \ r \ + $ // g
thinker3
14

от: http://vim.wikia.com/wiki/Change_end-of-line_format_for_dos-mac-unix

[Esc]:% s / \ r $ //

Алекс Гартрелл
источник
+1 за указание на официальный сайт документации. Для тех, кто использует вышеуказанную ссылку, см. Раздел «Преобразование текущего файла» на этой странице.
Жестянщик
Этот + 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)

Sparkida
источник
9

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

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

dos2unix input.txt input.txt

Выше используется предполагаемая клавиатура США. Используйте -опцию 437 для использования клавиатуры Великобритании.

dos2unix -437 input.txt input.txt
Венкатарамеш Коммую
источник
6

Следующие шаги могут преобразовать формат файла для DOS в Unix:

:e ++ff=dos  Edit file again, using dos file format ('fileformats' is ignored).[A 1]
:setlocal ff=unix    This buffer will use LF-only line endings when written.[A 2]
:w   Write buffer using unix (LF-only) line endings.

Ссылка: http://vim.wikia.com/wiki/Change_end-of-line_format_for_dos-mac-unix

ajitomatix
источник
6

С помощью следующей команды:

:%s/^M$//g 

Получить, ^Mчтобы появиться тип CtrlVтогда CtrlM. CtrlVговорит Vim принять следующий буквально введенный символ.

Дэйв Уэбб
источник
6

Комментарий о появлении ^ M - вот что сработало для меня. Просто набрав "^ M" в моем vi ничего не получилось (не найдено). Последовательность CTRL+ V CTRL+ Mсделала это отлично, хотя.

Моя рабочая команда замещения была

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

и это выглядело так на моем экране:

:%s/^M/\r/g
Dannid
источник
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окончания. сохранить как DOS, чтобы сохранить, сохранить как Linux для удаления. можно проверить с помощьюcat -v
HattrickNZ
Этот вопрос касается vim, а не нано.
Грант Бирчмайер
5
:g/Ctrl-v Ctrl-m/s///

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

Взятая в целом, эта команда заменяет все \rничем, удаляя их с концов строк.

Роб Уэллс
источник
4

Ты можешь использовать:

vim somefile.txt +"%s/\r/\r/g" +wq

или dos2unix utility.

Кристи Уолд
источник
3

Вы можете использовать следующую команду:
:%s/^V^M//g
где '^' означает использовать CTRLключ.

JayG
источник
2

Команда ниже используется для переформатирования всех файлов .sh в текущем каталоге, я проверял это на моей ОС Fedora.

for file in *.sh; do awk '{ sub("\r$", ""); print }' $file >luxubutmp; cp -f luxubutmp $file; rm -f luxubutmp ;done
Maerlyn
источник
2

В vim введите:

:w !dos2unix %

Это передаст содержимое вашего текущего буфера в команду dos2unix и запишет результаты поверх текущего содержимого. Vim попросит перезагрузить файл после

Таллак Твейде
источник
2

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

CBuzatu
источник
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:

Нужно удалить все эти символы ^ M из файла DOS? Пытаться

tr -d \\r < dosfile > newfile
    -- Originally by Dru <genesis@istar.ca>
Альбаро Перейра
источник
0

Хотя эта тема очень старая, я хотел бы добавить еще один материал из Викия:

%s/\r\+$//g

В этой строке найдите все знаки возврата каретки (одно и более повторений) до конца строки и удалите, так что просто \nостанетесь на eol.

loadaverage
источник
0

Это мой путь. Я открыл файл в DOS EOL и при сохранении файла, который будет автоматически преобразован в Unix EOL

autocmd BufWrite * :set ff=unix
Томас ПАБСТ
источник
0

если вы создадите файл в NotePad или NotePad ++ в Windows и перенесете его в Linux и откроете его с помощью vim, вы увидите ^ M в конце каждой строки. Чтобы удалить это,

На вашем терминале Linux введите

dos2unix filename.ext

Это сделает необходимую магию.

Сантле Камилус
источник
0

Я хотел новые строки вместо ^ M. Perl на помощь:

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

Или написать в стандартный вывод:

perl -p -e 's/\x0d/\n/g' < excel_created.txt
user3379574
источник