Конвертируйте окончания строки 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

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

В 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 он удаляет все возвраты каретки и оставляет только новые строки.

Чтобы запустить непосредственно в консоли 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

(см.: 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

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

Ссылка: Формат файла -&amp;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.Настройте разделители строк -&amp;gt; Изменить разделители строк для текущего файла (IntelliJ IDEA).

2.Настройте разделители строк -&amp;gt; Настройте разделители строк для новых файлов (IntelliJ IDEA).

3.Формат файла -&amp;gt; 3.Конвертация текущего файлаVim Tips Wiki -&amp;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

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

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