Конвертируйте окончания строки DOS в окончания строки Linux в vim
Если я открываю файлы, созданные в Windows, все строки заканчиваются на ^M
,
Как мне удалить этих персонажей сразу?
29 ответов
dos2unix - это утилита командной строки, которая сделает это, или :%s/^M//g
будет, если вы используете Ctrl-v Ctrl-m для ввода ^M, или вы можете :set ff=unix
и Vim сделает это за вас.
Документы по настройке 'fileformat' находятся здесь, и вики-сайт vim имеет исчерпывающую страницу о конверсиях, заканчивающихся строкой.
С другой стороны, если вы часто перемещаете файлы туда-сюда, вы можете не захотеть их конвертировать, а скорее сделать :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
В 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
формат.
:%s/\r+//g
В Vim он удаляет все возвраты каретки и оставляет только новые строки.
От: http://vim.wikia.com/wiki/Change_end-of-line_format_for_dos-mac-unix
[Esc]:% s / \ r $ //
Чтобы запустить непосредственно в консоли Linux:vim file.txt +"set ff=unix" +wq
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;
также, как уже упоминалось выше ^ M = Ctrl + V + Ctrl + M (не просто введите символ каретки "^" и M)
tr -d '\15\32' < winfile.txt > unixfile.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.
Ссылка: http://vim.wikia.com/wiki/Change_end-of-line_format_for_dos-mac-unix
Я нашел очень простой способ: открыть файл с помощью Nano: nano file.txt
Нажмите CTRL+O для сохранения, но перед нажатием Enter нажмите: ALT+D, чтобы переключить между окончаниями строк DOS и Unix/Linux, или: ALT+M, чтобы переключить между окончаниями Mac и Unix/Linux, затем нажмите Enter, чтобы сохранить и CTRL+X, чтобы выйти.
С помощью следующей команды:
:%s/^M$//g
Получить ^M
чтобы появиться введите CtrlV, затем CtrlM.CtrlV говорит Vim взять следующий введенный символ буквально.
Комментарий о появлении ^M - вот что сработало для меня. Просто набрав "^M" в моем vi ничего не получилось (не найдено). Последовательность CTRL+V CTRL+M сделала это отлично, хотя.
Моя рабочая команда замещения была
:%s/Ctrl-V Ctrl-M/\r/g
и это выглядело так на моем экране:
:%s/^M/\r/g
Ты можешь использовать:
vim somefile.txt +"%s/\r/\r/g" +wq
или же dos2unix utility
,
:g/Ctrl-v Ctrl-m/s///
CtrlM - символ \r
или возврат каретки, к которому добавляются окончания строки DOS. CtrlV указывает vim вставлять буквенный символ CtrlM в командной строке.
В целом эта команда заменяет все \r
ни с чем, удаляя их с концов линий.
Вы можете использовать следующую команду::%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
В vim введите:
:w !dos2unix %
Это передаст содержимое вашего текущего буфера в команду dos2unix и запишет результаты поверх текущего содержимого. Vim попросит перезагрузить файл после
Обычно есть 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>
Чтобы удалить эти символы окончания строки все сразу, независимо от того, где они встречаются в строке (это не очень хорошая идея, если две строки были разделены только знакомCR
потому что команда объединяет строки вместе):
:%s/\r//g
Ссылка: Формат файла -&gt; 6. Удаление ненужных символов CR или LF .
Но вы можете преобразовать этиDOS/Windows
строка заканчивается наUnix
.
Это означает, что для преобразования текущего файла из любой смесиCRLF/LF-only
окончания строк, поэтому все строки заканчиваютсяLF
только:
:update Save any changes.
:e ++ff=dos Edit file again, using dos file format ('fileformats' is ignored).
:setlocal ff=unix This buffer will use LF-only line endings when written.
:w Write buffer using unix (LF-only) line endings.
Ссылка: .
В приведенном выше примере замена:set ff=unix
с:set ff=mac
записал бы файл с Mac (CR-only
) окончания строк. Или, если бы это был файл Mac, вы бы использовали:e ++ff=mac
чтобы правильно прочитать файл, чтобы вы могли преобразовать окончания строк вunix
илиdos
.
Дополнительная ссылка:
1.Настройте разделители строк -&gt; Изменить разделители строк для текущего файла (IntelliJ IDEA).
2.Настройте разделители строк -&gt; Настройте разделители строк для новых файлов (IntelliJ IDEA).
3.Формат файла -&gt; 3.Конвертация текущего файлаVim Tips Wiki -&gt; Формат файла .
Это мой путь. Я открыл файл в DOS EOL и при сохранении файла, который будет автоматически преобразован в Unix EOL
autocmd BufWrite * :set ff=unix
Хотя эта тема очень старая, я хотел бы добавить еще один материал из Викия:
%s/\r\+$//g
при заполнении найдите все знаки возврата каретки (одно и более повторений) до конца строки и удалите, так что просто \n
останется на eol.
Это немного больше, чем вы просили, но:
nmap <C-d> :call range(line('w0'),line('w$'))->map({_,v-> getline(v)})->map({_,v->trim(v,join(map(range(1,0x1F)+[0xa0],{n->n->nr2char()}),''),2)})->map({k,v->setline(k+1,v)})<CR>
Запустите это и:set ff=unix|dos
и больше нет необходимости в unix2dos.
- форма trim() с одним аргументом имеет ту же маску по умолчанию, что и выше, плюс 0X20 (фактический пробел) вместо 0x1F
- эта маска по умолчанию очищает все непечатаемые символы, включая неразрывные пробелы [0xa0] , которые трудно найти
- создать список строк из диапазона строк
- сопоставьте этот список с функцией обрезки, используя тот же код маски, что и источник, меньше пробелов
- сопоставьте это снова, чтобы установить линию, чтобы заменить линии.
- все
:set fileformat=
на данный момент выбирает, какой eol сохранить, dos или unix - должно быть довольно легко изменить диапазон символов выше, если вы хотите исключить или добавить некоторые
Я хотел переводы строк вместо ^M. Perl на помощь:
perl -pi.bak -e 's/\x0d/\n/g' excel_created.txt
Или написать в стандартный вывод:
perl -p -e 's/\x0d/\n/g' < excel_created.txt
Если вы создадите файл в NotePad или NotePad ++ в Windows и перенесете его в Linux и откроете его с помощью vim, вы увидите ^M в конце каждой строки. Чтобы удалить это,
На вашем терминале Linux введите
dos2unix filename.ext
Это сделает необходимую магию.