Преобразование окончаний строк DOS в окончания строк Linux в Vim

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

Если вы делаете hexdump -C badfile и видите 0x0d 0x0a"\r\n", это ваша проблема.

Yzmir Ramirez 08.06.2019 07:49
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
747
1
585 344
27
Перейти к ответу Данный вопрос помечен как решенный

Ответы 27

:%s/\r\+//g

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

По какой-то причине вышеупомянутое не работало у меня под windows gvim. Но когда поменяли на :%s/\r//g, все заработало отлично.

soltysh 23.01.2014 13:35

@soltysh:% s / \ r \ + $ // g

thinker3 26.07.2015 02:32

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

CtrlM - это символ \r или возврат каретки, добавляемый в конце строки DOS. CtrlV сообщает Vim, что нужно вставить буквальный символ CtrlM в командную строку.

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

Разработано в Ответ Даннида.

Peter Mortensen 29.08.2020 17:07
Ответ принят как подходящий

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

Есть документация по настройке формат файла, а в вики Vim есть исчерпывающий страница в строке, завершающие конверсии.

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

Вот и все, спасибо, приятель:> Bash не запускал скрипт из-за окончания строки. Тупой блокнот действительно ...

Gepsens 09.08.2011 05:29

:%s/^M//g должен быть :%s/\r//g, потому что ^M означает просто «сопоставить заглавную букву« M »в начале строки».

Bunyk 12.09.2013 12:52

Нет, если вы сделаете так, как сказано в ответе, и «используйте ctrl-v ctrl-m для ввода ^ M».

pjz 13.09.2013 06:43
ctrl-v is no good, on windows it pastes clipboard contents to the command line. Solution :%s/\r//g worked for me, cheers @Bunyk
roblogic 26.05.2015 06:32

Я запутался, когда попробовал это, потому что казалось, что на преобразование уходит много времени, тогда как на самом деле он просто ждал ввода пользователя.

mwfearnley 29.06.2016 18:45

@ropata В Windows вам нужен ctrl-q.

ruffin 31.08.2016 19:28

dos2unix может быть лучшим решением, но только если он присутствует в системе. Я не думаю, что мы должны давать ответ с его помощью. set ff=unix кажется лучшим ответом.

mwfearnley 28.02.2017 20:21

Должно быть, мне чего-то не хватает, потому что set ff=unix ничего не делает. Возможно, он конвертирует файл, но все символы ^M все еще там.

felwithe 30.03.2017 19:11

Если вы хотите сохранить новые строки, лучше всего это сделать:% s / \ r / \ r / g unix / vim вставит правильный символ новой строки с заменой \ r

bjm88 29.09.2017 22:19

как ^M (Ctrl + V Ctrl + M), так и \r не найдены в моем файле, но я определенно вижу их в diff (VIM - Vi IMproved 7.4)

vladkras 12.12.2017 14:42

:%s/\r//g или :%s/^M//g не работают. :set ff=unix работает по желанию. Но он форматирует весь файл, а не только те строки, которые содержат ^ m

Arun Kumar 04.09.2019 14:21

Существует хороший источник для изменения или преобразования из Windows в UNIX.

Arun Kumar 04.09.2019 14:34

@felwithe -: set ff = unix, затем вы: wq файл для записи нового формата. Я сделал это две минуты назад, чтобы очистить файл, полученный от разработчика.

Andrew Beals 27.12.2019 19:53

Используйте команду vim set, чтобы показать формат файла :set ff?. Команда возвращает fileformat = <dos / unix / mac>, чтобы определить текущий формат файла.

NKSM 08.04.2020 00:16

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

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

:%s/^M$//g

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

От: Формат файла

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

+1 за указание на официальный сайт документации. Для всех, кто использует указанную выше ссылку, см. Раздел «Преобразование текущего файла» на этой странице.

the Tin Man 07.01.2013 20:48

Это + vim -b <filename> сработало как шарм, спасибо, +1

Jan Molak 04.11.2014 16:10

Ссылка наполовину разорвана. Он перенаправляет на другую страницу.

Peter Mortensen 29.08.2020 16:53

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

:set fileformat=unix

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

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

:help fileformat

Эта команда, похоже, ничего не делает в моем Windows vim. В моем представлении все еще есть символы ^M.

Grant Birchmeier 21.06.2017 00:29

Добавление set fileformat=unix в мой файл .vimrc сработало.

Joey Allen 08.10.2017 03:34

:set fileformat=unix для преобразования из DOS в Unix.

Это действительно решило проблему для меня. Мне не удалось найти этих персонажей во время поиска.

Captain Insaneo 05.08.2015 17:10

Измените окончания строк в представлении:

: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

Большое спасибо. Я пробовал vi + ': wq ++ ff = unix' <filepath> для ленивого вроде меня.

a_secenthusiast 22.05.2016 10:24

Это должен быть самый популярный ответ. :w +ff=unix намного лучше, чем большинство других вещей, написанных здесь, и сценарий bash - приятный бонус.

mkasberg 18.06.2017 06:42

Команды :e, похоже, ничего не делают в моей установке Windows vim. Мой вид по-прежнему показывает коды ^M.

Grant Birchmeier 21.06.2017 00:28

Я повсюду читал :e ++ff=unix, но для меня самый простой, который сработал, - это :w ++ff=unix, затем выйдите и снова откройте файл.

Olivier Pons 06.12.2020 13:06

@OlivierPons, но: e делает то же самое, что и повторно открывает файл? Как добавление дополнительных ненужных шагов к вашему решению упрощает его?

Victor Zamanian 08.01.2021 10:50

Я обычно использую

:%s/\r/\r/g

что кажется немного странным, но работает из-за того, как Vim сопоставляет перевод строки. Мне тоже легче запомнить :)

Это работает последовательно на разных платформах. Лучший ответ здесь.

thebigjc 22.06.2012 21:28

У меня никогда раньше не было проблем с :set ff=unix, но файл, который я открыл сегодня, должен быть особенно странным. Vim сказал, что это уже fileformat=unix, но все окончания строк были ^M. Это решение сработало для меня.

Chris B 21.03.2013 12:55

Это решение добавляет мне ненужные лишние строки, удваивая количество строк в файле. :%s/\r//g вместо этого работает у меня.

Victor Zamanian 23.08.2013 03:57

Виктор, у ваших файлов скорее всего \ r \ n окончания. \ r не читается как новая строка, а \ n -. В файлах, с которыми я сталкиваюсь, есть \ r, и вам нужно добавить символ новой строки.

Joeyjoejoejr 12.02.2015 23:59

astyle, dos2unix, vim fileformat, notepad, ultra-edit и т. д. не работали; это сделал! Перед тем, как попробовать это, мне пришлось открыть файл в Wordpad, вставить в блокнот, а затем вставить в ultraedit, прежде чем я смог вернуться в VIM. Кто-то поместил различные типы типов перевода строки и EOF в файлы, что затем затруднило поиск, где в исходных текстах находятся вызовы функций. grep вернул нежелательную запись для файла со смешанными типами перевода строки и EOF. Разочарован тем, что другие методы не работают. Спасибо за простое решение!

TheHairyOne 20.09.2016 00:14

Я пробовал другие решения здесь, но это единственное, что сработало для меня. Я импортировал файл CSV в Excel (Mac OS X) и, немного преобразовав его, экспортировал как CSV. В итоге получился однострочный файл с ^M, разделяющим исходные строки.

user766353 12.10.2016 03:28

Я недостаточно энергичен, чтобы понять, почему, но это решение работает для меня в обстоятельствах, когда принятый ответ не удался.

Chris S 07.11.2016 18:06

Когда вы делаете hexdump -C badfile, вы можете увидеть шестнадцатеричную последовательность 0x0d 0x0a, которая является вашей проблемой.

Yzmir Ramirez 08.06.2019 07:48

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

Cecil Curry 28.09.2019 06:24

Метод @VictorZamanian, это должен помочь решить проблему с добавлением новых строк.

Victor S. 08.01.2021 10:00

@VictorS. ? У меня не было проблем с добавлением новой строки. У меня есть дополнительные символы новой строки, которые мне нужны не сделал. И если вы дочитаете мой комментарий до конца, то увидите, что у меня уже есть решение. Спасибо хоть.

Victor Zamanian 08.01.2021 10:48

Обычно для этого можно использовать команду dos2unix. Просто убедитесь, что вы прочитали руководство, так как версии GNU и BSD различаются по тому, как они обрабатывают аргументы.

Версия BSD:

dos2unix $FILENAME $FILENAME_OUT
mv $FILENAME_OUT $FILENAME

Версия GNU:

dos2unix $FILENAME

В качестве альтернативы вы можете создать свой собственный dos2unix с любым из предложенных здесь ответов, например:

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

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

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

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

dos2unix input.txt input.txt

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

dos2unix -437 input.txt input.txt

Следующие шаги могут преобразовать формат файла для 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.

Ссылка: Формат файла

Ссылка наполовину разорвана. Он перенаправляет на другую страницу.

Peter Mortensen 29.08.2020 17:04

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

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

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

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

:%s/^M/\r/g

Преобразование каталога файлов из 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).

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

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

Из Викии:

%s/\r\+$//g

При этом будут найдены все знаки возврата каретки (одно или несколько повторений) до конца строки и будут удалены, так что только \n останется в EOL.

Я нашел очень простой способ: открыть файл с помощью нано: 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 11.05.2016 23:58

Этот вопрос касается vim, а не nano.

Grant Birchmeier 21.06.2017 00:31

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

autocmd BufWrite * :set ff=unix

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

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

Или утилита dos2unix.

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

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

Или написать в stdout:

perl -p -e 's/\x0d/\n/g' < excel_created.txt

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

В терминале Linux введите

dos2unix filename.ext

Это произведет необходимую магию.

dos2unix is not installed by default on e.g. Ubuntu 20.04 (Focal Fossa).
Peter Mortensen 29.08.2020 19:03

Я знал, что где-то видел это. Вот совет по входу в систему FreeBSD:

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

tr -d \r < dosfile > newfile
    -- Originally by Dru <[email protected]>

В Vim введите:

:w !dos2unix %

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

Для запуска непосредственно в консоли Linux:

vim file.txt +"set ff=unix" +wq

В VIM:

:e ++ff=dos | set ff=unix | w!

В оболочке с VIM:

vim some_file.txt +'e ++ff=dos | set ff=unix | wq!'

e ++ff=dos - принудительно открыть файл в формате dos.

set ff=unix - конвертировать файл в формат unix.

Другие вопросы по теме