Символ '^ M' в конце строк

Когда я запускаю конкретный сценарий SQL в средах Unix, я вижу символ «^ M» в конце каждой строки сценария SQL, поскольку он отображается в командной строке. Я не знаю, на какой ОС изначально был создан сценарий SQL.

Что вызывает это и как это исправить?


person Community    schedule 15.09.2008    source источник


Ответы (16)


Это вызвано символами конца строки DOS / Windows. Как сказал Энди Уитфилд, команда dos2unix в Unix поможет решить эту проблему. Если вам нужна дополнительная информация, вы можете прочитать страницы руководства по этой команде.

person Thomas Owens    schedule 15.09.2008
comment
В некоторых системах (например, Ubuntu) эта команда называется fromdos - person bobwienholt; 04.12.2012
comment
Вы можете легко получить этот инструмент на OSX с brew install dos2unix, если у вас установлен homebrew. - person philipp; 12.06.2013

Исправьте окончания строк в vi, выполнив следующее:

:set fileformat=unix

:w

person Tim Abell    schedule 16.09.2008
comment
Это блестящий ответ. Большое спасибо. (сохранена установка dos2unix, инструмента, который я бы использовал только один раз) - person Jamsi; 05.02.2014
comment
по какой-то причине это не удаляет ^Ms. справочный файл: /etc/timidity/fluidr3_gm.cfg. - person phil294; 06.04.2017

Причина в различии между тем, как ОС на базе Windows и ОС на базе Unix хранят маркеры конца строки.

Операционные системы на базе Windows, благодаря их наследию DOS, хранят конец строки как пару символов - 0x0D0A (возврат каретки + перевод строки). Операционные системы на основе Unix просто используют 0x0A (перевод строки). ^M, который вы видите, является визуальным представлением 0x0D (возврата каретки).

В этом поможет dos2unix. Возможно, вам также потребуется настроить исходный код скриптов, чтобы он был «дружественным к Unix».

person ColinYounger    schedule 15.09.2008
comment
Я бы не сказал, что текущие версии Windows имеют какое-то наследие DOS. Однако у них все еще есть ограничения совместимости. - person Joey; 08.03.2013
comment
Это простой способ, если вы создадите инструмент автоматического преобразования. Спасибо - person Pjl; 09.04.2015
comment
Но почему ^M? Почему "^"? Почему «М»? - person 1737973; 28.07.2015
comment
Потому что это управляющий персонаж. ^ - это визуальное представление нажатия клавиши управления. Под его просто конкретными байтами ^ - это то, как редактор представляет их. - person Hejazzman; 06.08.2015

Самый простой способ - использовать vi. Я знаю, что это звучит ужасно, но это просто и уже установлено в большинстве сред UNIX. ^ M - это новая строка из среды Windows / DOS.

из командной строки: $ vi filename

Затем нажмите «:», чтобы перейти в командный режим.

Искать и заменить все глобально - это :%s/^M//g "Нажмите и удерживайте элемент управления, затем нажмите V, затем M", при этом ^ M ничего не заменит.

Затем, чтобы написать и выйти, введите ":wq" Готово!

person Bernie Perez    schedule 15.09.2008
comment
Как заменить его в emacs? - person herbertD; 01.11.2013
comment
Спасибо за подробное описание того, как вводить символ ^ M! Вместо этого я бы заменил его на \ r. Так я и сделал:% s / ^ M / \ r / g - person aharris88; 24.11.2014

Попробуйте использовать dos2unix, чтобы удалить ^ M.

person Andy Whitfield    schedule 15.09.2008

In vi, do a :%s/^M//g

Чтобы получить ^M, удерживайте клавишу CTRL, нажмите V, затем M (оба при удерживании клавиши управления), и появится ^M. Это найдет все вхождения и ничего не заменит.

person dogbane    schedule 15.09.2008
comment
Чтобы заменить ^ M на дружественный к unix разрыв строки: :%s/^M/\r/g - person Gary Oak; 26.02.2014

Скрипт SQL изначально был создан в ОС Windows. Символы '^ M' являются результатом того, что Windows и Unix имели разные представления о том, что использовать для символа конца строки. Вы можете использовать perl в командной строке, чтобы исправить это.

perl -pie 's/\r//g' filename.txt
person Bill the Lizard    schedule 15.09.2008
comment
Конечно, вы МОЖЕТЕ использовать perl, но не могли бы вы предложить perl вместо dos2unix? - person Thomas Owens; 15.09.2008
comment
Я просто предлагаю альтернативу, поскольку четыре человека уже сказали использовать dos2unix. - person Bill the Lizard; 15.09.2008
comment
Да, я нашел это полезным, потому что я работаю на отсталой рабочей станции в офисе с доисторическим ИТ-отделом. За исключением того, что я использовал вариант: perl -pi -e s / \ x0D / \ n / g file.csv - person Rimian; 11.02.2010

^ M обычно вызывается оператором новой строки Windows и переводится в Unix выглядит как ^ M. Команда dos2unix должна удалить их красиво

dos2unix [параметры] [-c convmode] [-o файл ...] [-n infile outfile ...]

person jW.    schedule 15.09.2008

C:\tmp\text>dos2unix hello.txt helloUNIX.txt

Sed еще более широко доступен и может делать подобные вещи, даже если dos2unix не установлен.

C:\tmp\text>sed s/\r// hello.txt > helloUNIX.txt  

Вы также можете попробовать tr:

cat hello.txt | tr -d \r > helloUNIX2.txt  

Вот результаты:

C:\tmp\text>dumphex hello.txt  
00000000h: 48 61 68 61 0D 0A 68 61 68 61 0D 0A 68 61 68 61 Haha..haha..haha  
00000010h: 0D 0A 0D 0A 68 61 68 61 0D 0A                   ....haha..  

C:\tmp\text>dumphex helloUNIX.txt  
00000000h: 48 61 68 61 0A 68 61 68 61 0A 68 61 68 61 0A 0A Haha.haha.haha..  
00000010h: 68 61 68 61 0A                                  haha.  

C:\tmp\text>dumphex helloUNIX2.txt  
00000000h: 48 61 68 61 0A 68 61 68 61 0A 68 61 68 61 0A 0A Haha.haha.haha..  
00000010h: 68 61 68 61 0A                                  haha.  
person Community    schedule 15.09.2008

Чтобы заменить символы ^ M в редакторе vi, используйте ниже

откройте текстовый файл, скажем t1.txt

vi t1.txt

Войдите в командный режим, нажав shift + :

затем нажмите клавиши, как указано %s/^M/\r/g

in above ^M is not (shift + 6)M instead it is (ctrl + V)(ctrl + M)
person Community    schedule 17.04.2013
comment
Ваша последняя строка - это то, чего мне не хватало во всех предыдущих ответах. Я продолжал получать 'совпадений не найдено, потому что я делал shift + 6, поэтому я сделал то, что сделал бы каждый хакер, и обошел свое недоразумение своим собственным решением: записал макрос, чтобы сделать $, чтобы перейти к концу каждой строки, а затем нажмите x, просто повторить макрос для количества строк в файле. - person darethas; 13.08.2013

Альтернативой команде dos2unix может быть использование стандартных утилит, например sed.

Например, dos to unix:

sed 's/\r$//' dos.txt > unix.txt

unix для dos:

sed 's/$/\r/' unix.txt > dos.txt
person Community    schedule 18.07.2013

Вы можете удалить ^ M из файлов напрямую с помощью команды sed, например:

sed -i'.bak' s/\r//g *.*

Если вас устраивают изменения, удалите файлы .bak:

rm -v *.bak
person Community    schedule 07.02.2014

Преобразуйте окончания строк DOS / Windows (\ r \ n) в окончания строк Unix (\ n) с помощью tr:

tr '\r\n' '\n' < dosFile.txt > unixFile.txt

Сообщение о замене новой строки из командной строки Unix

person Community    schedule 03.06.2014

od -a $file полезен для изучения этих типов вопросов в Linux (аналогично dumphex выше).

person Allan Wind    schedule 15.09.2008

В Perl, если вы не хотите устанавливать переменную $ / и использовать chomp (), вы также можете:

$var =~ /\r\n//g;

Мои два цента

person Community    schedule 07.03.2013

Еще одна команда vi, которая подойдет: :%s/.$// Удаляет последний символ каждой строки в файле. Недостатком этой команды поиска и замены является то, что ей все равно, какой будет последний символ, поэтому будьте осторожны, чтобы не вызывать его дважды.

person Scottie T    schedule 15.09.2008
comment
Зачем упоминать об этом, если вы знаете, что это ненадежно? - person minexew; 07.02.2014