Преобразуйте окончания строк DOS в Linux в vim
Вопрос
Если я открываю файлы, созданные мной в Windows, все строки заканчиваются на ^M
.
Как мне удалить все эти символы сразу?
Решение
dos2unix есть ли утилита командной строки, которая будет это делать, или :%s/^M//g
будет, если вы используете Ctrl-v Ctrl-m чтобы ввести ^ M, или вы можете :set ff=unix
и vim сделает это за вас.
Документы по настройке "формат файла" следующие здесь, а в vim wiki есть всеобъемлющая конверсии, заканчивающиеся на странице в строке.
С другой стороны, если вы часто перемещаете файлы взад и вперед, возможно, вам захочется не конвертировать их, а выполнять :set ff=dos
, таким образом, vim будет знать, что это файл DOS, и использовать соглашения DOS для окончаний строк.
Другие советы
Измените окончания строк в представлении:
: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
Обычно я использую
:%s/\r/\r/g
что кажется немного странным, но работает из-за того, как vim сопоставляет переводы строк.Мне также кажется, что это легче запомнить :)
Я предпочитаю использовать следующую команду :
:set fileformat=unix
Вы также можете использовать mac
или dos
чтобы соответственно преобразовать ваш файл в файловое соглашение macintosh или MS-DOS / MS-Windows.И это ничего не дает, если файл уже находится в правильном формате.
Для получения дополнительной информации обратитесь к справке vim :
:help fileformat
:%s/\r+//g
В Vim это удаляет все возвраты каретки и оставляет только новые строки.
:set fileformat=unix
для преобразования из dos в unix.
От: http://vim.wikia.com/wiki/Change_end-of-line_format_for_dos-mac-unix
[Esc]:%s/ $//
dos2unix
может напрямую изменять содержимое файла.
Вы можете использовать его непосредственно в файле, без необходимости временного перенаправления файла.
dos2unix input.txt input.txt
В приведенном выше примере используется предполагаемая американская клавиатура.Используйте -
437 возможность использования британской клавиатуры.
dos2unix -437 input.txt input.txt
Преобразование каталога файлов из 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;
кроме того, как упоминалось выше ^М = Ctrl+V + Ctrl+M (не вводите просто символ каретки "^" и M)
tr -d '\15\32' < winfile.txt > unixfile.txt
(см .: http://kb.iu.edu/data/acux.html)
Следующие шаги позволяют преобразовать формат файла для 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
С помощью следующей команды:
:%s/^M$//g
Получить ^M
чтобы появиться, введите CtrlV тогда CtrlM. CtrlV указывает Vim воспринимать следующий введенный символ буквально.
Я нашел очень простой способ:Откройте файл с помощью nano: nano file.txt
Пресса CTRL+O для сохранения, но перед нажатием Войти, нажать: АЛЬТ+D для переключения между окончаниями строк DOS и Unix/ Linux или: АЛЬТ+M чтобы переключаться между окончаниями строк Mac и Unix / Linux, нажмите Войти чтобы сохранить и CTRL+X чтобы уволиться.
:g/Ctrl-v Ctrl-m/s///
CtrlM это персонаж \r
, или возврат каретки, который добавляют окончания строк DOS. CtrlV указывает vim вставить литерал CtrlM символ в командной строке.
Взятая в целом, эта команда заменяет все \r
ни с чем, удаляя их с концов строк.
Вы можете использовать:
vim somefile.txt +"%s/\r/\r/g" +wq
или dos2unix utility
.
Комментарий о появлении ^ M - это то, что сработало для меня.Просто набрав "^ M" в моем vi, я ничего не получил (не найден).Тот Самый CTRL+V CTRL+M тем не менее, sequence сделала это идеально.
Моей рабочей командой замены было
:%s/Ctrl-V Ctrl-M/\r/g
и на моем экране это выглядело примерно так:
:%s/^M/\r/g
Вы можете использовать следующую команду:
:%s/^V^M//g
где '^' означает использовать CTRL Клавиша.
приведенная ниже команда используется для переформатирования всего .файл sh в текущем каталоге, я протестировал его на своей ОС Fedora.
for file in *.sh; do awk '{ sub("\r$", ""); print }' $file >luxubutmp; cp -f luxubutmp $file; rm -f luxubutmp ;done
Обычно существует 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}";
}
Я знал, что где-то это уже видел.Вот совет по входу во FreeBSD:
Нужно удалить все эти символы ^M из файла DOS?Попробуй
tr -d \\r < dosfile > newfile
-- Originally by Dru <genesis@istar.ca>
В vim введите:
:w !dos2unix %
Это передаст содержимое вашего текущего буфера команде dos2unix и запишет результаты поверх текущего содержимого.Vim попросит перезагрузить файл после
Для запуска непосредственно в консоли Linux:vim file.txt +"set ff=unix" +wq
Хотя эта тема очень старая, я бы хотел добавить еще один материал из wikia:
%s/\r\+$//g
эта заливка находит все знаки возврата каретки (одно и более повторений) до конца строки и удаляет, поэтому просто \n
остановлюсь в eol.
Это мой путь.Я открыл файл в dos EOL, и когда я сохраню файл, он автоматически преобразуется в unix EOL
autocmd BufWrite * :set ff=unix
если вы создадите файл в NotePad или NotePad ++ в Windows, перенесете его в Linux и откроете с помощью vim, вы увидите ^ M в конце каждой строки.Чтобы удалить это,
На вашем терминале Linux введите
имя файла dos2unix.ext
Это произведет требуемое волшебство.
Я хотел, чтобы вместо букв ^M были новые строки.Perl спешит на помощь:
perl -pi.bak -e 's/\x0d/\n/g' excel_created.txt
Или написать в стандартный вывод:
perl -p -e 's/\x0d/\n/g' < excel_created.txt