2017-02-09 12 views
2

У меня есть textfile с терминаторами линии CRLF. Файл содержит две строки текста (отображенные в Vim):Почему sed делает ограничители строк видимыми в vim

 
foo 
bar 

сказать, что я хочу найти шаблон foo и заменить всю строку с goo, поэтому я бегу:

 
sed -i 's/foo.*/goo/' textfile 

После операции textfile показывает в Vim вот так:

 
goo 
bar^M 

Мой вопрос: Почему в Vim появился видимый ранее возврат каретки?

ответ

3

Команда:

sed -i 's/foo.*/goo/' textfile 

удалили \r от конца строки, поскольку \r просто произвольный символ для СЭД на UNIX, соответствует по .*.

Похоже, что Vim достаточно умен, чтобы не отображать возврат каретки стиля^M для Windows, если они используются последовательно в файле. Из-за вышеупомянутой команды sed они не используются последовательно, поскольку они удаляют только \r из линий, соответствующих foo.*.

Если это проблема для вас, я рекомендую использовать:

sed -i 's/foo.*/goo\r/' textfile 

sydill's comment указал мне на правый раздел руководства, который описывает такое поведение: :help file-formats:

... Если вы начнете редактировать новый файл, а параметр «fileformats» не пуст (который по умолчанию), Vim попытается определить, будут ли строки в файле ar e, разделенные указанными форматами. Если установлено значение «unix, dos», Vim будет проверить линии с одним (как используется в Unix и Amiga) или с помощью пары (MS-DOS). Только когда ВСЕ строки заканчиваются, 'fileformat' установлен в на "dos", в противном случае он установлен в "unix". Когда «fileformats» включает в себя «mac», и никакие символы не найдены в файле, «fileformat» установлен на «mac». ...

+0

Это отвечает на мой вопрос и предлагает решение проблемы. Спасибо! – gortsu

+1

Это именно то, что происходит, но, возможно, может быть сформулировано _consistently_ вместо _concess_? Существует полезный абзац в ': h файлах-форматах', который я бы добавил к этому ответу (если вы начнете редактирование ... Только когда все строки заканчиваются на , 'fileformat' установлен в" dos ", в противном случае он установлен в «unix») – sidyll

+1

Позвольте мне изменить/добавить это. Спасибо за комментарий! – hek2mgl