vim показывает на каждой строке, заканчивающейся ^ M
Как я могу заменить это «нормальным» переводом строки?
vim показывает на каждой строке, заканчивающейся ^ M
Как я могу заменить это «нормальным» переводом строки?
Ответы:
Это единственное, что сработало для меня:
: e ++ ff = dos
Нашел по адресу: http://vim.wikia.com/wiki/File_format
:e ++ff=dos
затем :set ff=unix
преобразует окончания в нормальный формат.
:%s/<Ctrl-V><Ctrl-M>/\r/g
Где <Ctrl-V><Ctrl-M>
означает тип Ctrl+, Vто Ctrl+ M.
:%s
заменитель,% = все строки
<Ctrl-V><Ctrl-M>
Символы ^ M (Ctrl-V - это способ записи символа Ctrl ^ в Vim, а Ctrl-M записывает M после регулярного выражения, в результате чего получается специальный символ ^ M)
/\r/
с новой строкой ( \r
)
g
И сделать это глобально (не только первое вхождение на линии).
:%s/<Ctrl-V><Ctrl-M>/\r/g
(где \ r заменяет ^ M новой строкой).
В Linux и Mac OS работает следующее:
:%s/^V^M/^V^M/g
где ^V^M
означает тип Ctrl+ V, затем Ctrl+ M.
Примечание: в Windows вы, вероятно, захотите использовать ^Q
вместо ^V
, так как по умолчанию ^V
отображается для вставки текста.
%s/\r/\r/g
хорошо работает на MacVim для файла, отображаемого только ^M
в конце строк (одна длинная строка в терминах MacVim). Понятно, что \ r означает разные вещи в шаблоне против частей замены этой команды.
В vim
, взгляд на формат файла - DOS или Unix:
:set filetype=unix
:set fileformat=unix
Файл будет записан обратно без символов возврата каретки (CR, ^ M).
set ff=unix
как маленький ярлык точно так же, как ft
ярлык дляfiletype
Файл, который я создал с помощью BBEdit, который я видел в MacVim, отображал кучу ^M
возвратов строк вместо обычных. Следующая строка заменяет решенную проблему - надеюсь, это поможет:
:%s/\r/\r/g
Это интересно, потому что я заменяю разрывы строк тем же символом, но я полагаю, что Vim просто нужно, чтобы новый \ r отображался правильно. Мне было бы интересно узнать основную механику того, почему это работает.
\r
символы, \n
несмотря на то, что указывалось \r
как замена Не жалуюсь, это именно то, что я хотел. Просто странно.
Во-первых, используйте, :set ff?
чтобы выяснить формат файла вашего файла.
Я предполагаю, что это может быть unix
, тогда проблема в том, что ваш файл был создан с fileformat=dos
добавлением «^ M ^ J» в конец строки, но читается с flieformat=unix
удалением только «^ J» с конца строки, оставляя там «^ M».
Просто :e ++ff=dos
введите в командной строке Vim, чтобы изменить формат файла с Unix на DOS. Это должно решить проблему. Если нет, :%s/\r//g
должен помочь вам.
:e ++ff=dos
затем :set ff=unix
и:w
для того, чтобы символ ^ M соответствовал, мне пришлось визуально выбрать его, а затем использовать команду «Копировать в буфер обмена» для его извлечения. Вы можете проверить это, выполнив поиск символа, прежде чем пытаться выполнить команду замены.
/^M
следует выбрать первую плохую строку
:%s/^M/\r/g
заменит все ошибочные ^ M на возврат каретки.
Это как функции в MacVim, который основан на gvim 7.
РЕДАКТИРОВАТЬ:
Снова возникла эта проблема на моем компьютере с Windows 10, на котором установлена Ubuntu для Windows, и я думаю, что это вызывает проблемы с форматированием файлов для vim. В этом случае изменение ff на unix, mac или dos сделало только изменение ^ M на ^ J и обратно.
Решение в этом случае:
:%s/\r$/ /g
:%s/ $//g
Причина, по которой я пошел по этому пути, заключается в том, что я хотел убедиться, что у меня нет деструктивного файла. Я мог бы, :%s/\r$//g
но это удалило бы возврат каретки прямо, и могло бы иметь неожиданные результаты. Вместо этого мы преобразуем единственный символ CR, здесь символ ^ M, в пробел, а затем удаляем все пробелы в конце строк (что для меня является желательным результатом независимо от)
Извините за возрождение старого вопроса, на который уже давно дан ответ, но, похоже, возникла некоторая путаница, и я подумал, что помогу прояснить кое-что из этого, так как это происходит в поисковой выдаче Google.
Ни один из них не работал для меня, поэтому я попробовал это, который работал:
тип :%s/
Нажмите CTRL-VCTRL-M
тип //g
Нажмите Enter
Таким образом, общая команда в Vim должна выглядеть :%s/^M//g
Что это делает: :%s
(найти и заменить) /^M/
(этот символ) /
(без символов) g
(глобально).
^ M извлекается Ctrl+ Vи M, так что
s/^M//g
Без необходимости использовать Ctrl:
:%s/\r$//
Простая вещь, которая работала для меня
dos2unix filename
Я сделал это с помощью sed:
sed -i -e 's/\r/\n/g' filename
sed -e 's/\r/\n/g' <<< 'over and over'
->oven and oven
sed
но не для BSD sed
(как в OSX). Любой, кто исправляет разрывы строк, вероятно, работает с различными операционными системами, поэтому полезно знать, когда ответ будет работать.
Как насчет просто:
:%s/\r//g
это полностью сработало для меня.
Это просто очистит конец строки всех строк, удалит ^ M и все.
Есть много других ответов на этот вопрос, но, тем не менее, мне лучше всего подходит следующее, так как мне нужно было решение для командной строки:
vim -u NONE -c 'e ++ff=dos' -c 'w ++ff=unix' -c q myfile
Объяснение:
myfile
:e ++ff=dos
чтобы принудительно перезагрузить весь файл как конец строки DOS.:w ++ff=unix
чтобы записать файл, используя конец строки UnixCtrl+ Mминимизирует мое окно, но Ctrl+ Enterфактически вставляет ^M
символ. Я также должен был быть уверен, чтобы не отрывать Ctrlключ между нажатиями.
Таким образом, решение для меня было:
:%s/<Ctrl-V><Ctrl-Enter>/\r/g
Где <Ctrl-V><Ctrl-Enter>
означает нажать и удерживать Ctrl , нажмите и отпустите V, нажмите и отпустите Enter, а затем отпустите Ctrl .
Вышеупомянутое решение добавит дополнительную строку между существующими строками, потому что уже есть невидимая \r
после ^M
.
Чтобы предотвратить это, вы хотите удалить ^M
символы, не заменяя их.
:%s/<Ctrl-V><Ctrl-Enter>//g
Где %
означает «в этом буфере», s
означает «заменить», « /
означает» (найти) следующий шаблон, « <Ctrl-V><Ctrl-Enter>
относится к клавишам, нажимаемым для получения ^M
символа (см. Выше), //
означает« с пустым »(или,« с шаблоном » между этими двумя косыми чертами, который является пустым "), и g
является флагом, означающим" глобально ", в отличие от первого вхождения в строке.
Это сработало для меня:
\n
конец строки)Итак, в VIM:
:set ff=unix
:w
В моем случае,
Ничто из вышеперечисленного не сработало, у меня был файл CSV, скопированный на компьютер Linux с моего Mac, и я использовал все вышеперечисленные команды, но ничего не помогло, кроме приведенного ниже
tr "\015" "\n" < inputfile > outputfile
У меня был файл, в котором символы ^ M были переключены между строк примерно так, как показано ниже
Audi,A4,35 TFSi Premium,,CAAUA4TP^MB01BNKT6TG,TRO_WBFB_500,Trico,CARS,Audi,A4,35 TFSi Premium,,CAAUA4TP^MB01BNKTG0A,TRO_WB_T500,Trico,
В качестве альтернативы, есть утилиты с открытым исходным кодом, называемые dos2unix и unix2dos, которые делают именно это. В системе Linux они, вероятно, установлены по умолчанию; для системы Windows вы можете загрузить их с http://www.bastet.com/ среди других.
sed s/^M//g file1.txt > file2.txt
где ^ M набирается одновременным нажатием 3 клавиш, ctrl + v + m
Используйте одну из этих команд:
:%s/\r//g
Или
:%s/\r\(\n\)/\1/g
Это сработало для меня:
:% s/\r\n/\r
Ни одно из этих предложений не сработало для меня, так как мне удалось получить множество ^M
разрывов строк при работе с vim и eclipse. Я подозреваю, что я столкнулся с внешним случаем, но в случае, если это помогает кому-то, кого я сделал.
:%s/.$//g
И это решило мою проблему
:g/^M/s// /g
Если вы печатаете ^M
с помощью, Shift+6 Caps+M
он не примет.
Вам нужно ввести ctrl+v ctrl+m
.
^M
дает нежелательные разрывы строк. Для этого мы можем использовать sed
команду следующим образом:
sed 's/\r//g'
Просто удалите set binary
в свой .vimrc!
Чтобы использовать sed
на MacOS, сделайте это:
sed -i.bak $'s/\r//' <filename>
Объяснение:$'STRING'
синтаксис здесь относится к Баш оболочки. Маки не воспринимаются \r
как особые персонажи. Цитируя командную строку в ней, $''
вы говорите оболочке заменить \r
действительный \r
символ, указанный в стандарте ANSI-C.
«Эта функция сохраняет список переходов
fun! Dos2unixFunction()
let _s=@/
let l = line(".")
let c = col(".")
try
set ff=unix
w!
"%s/\%x0d$//e
catch /E32:/
echo "Sorry, the file is not saved."
endtry
let @/=_s
call cursor(l, c)
endfun
com! Dos2Unix keepjumps call Dos2unixFunction()
Я провел день, борясь с \ n ctrl-v 012 (оба из которых дают мне ноль). И работал через эту тему, пока я не достиг мета-фотографа.
\r
работал нормально для меня!
/),/s/),/)\r/g
получилось примерно так:
дополнительный черный список: i386 (0.4.1, 0.4.1 + nmu1), libmount1: i386 (2.20.1-5.1, 2.20.1 -5.2), libblkid1: i386 (2.20.1-5.1, 2.20.1-5.2) , libapt-pkg4.12: i386 (0.9.7.4, 0.9.7.5), nmap: i386 (6.00-0.1, 6.00-0.2), libsane-common: i386 (1.0.22-7.3,
во что-то вроде этого:
26 libwv-1.2-4: i386 (1.2.9-3, автоматический)
27 openjdk-6-jre-headless: i386 (6b24-1.11.4-3, автоматический)
28 jed: i386 (0.99.19-2.1)
Магия. Я глубоко благодарен