Символ '^ M' в конце строки - PullRequest
94 голосов
/ 15 сентября 2008

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

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

Ответы [ 16 ]

76 голосов
/ 15 сентября 2008

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

73 голосов
/ 16 сентября 2008

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

:set fileformat=unix

:w

39 голосов
/ 15 сентября 2008

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

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

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

24 голосов
/ 15 сентября 2008

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

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

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

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

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

13 голосов
/ 15 сентября 2008

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

9 голосов
/ 15 сентября 2008

В vi сделайте :%s/^M//g

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

8 голосов
/ 15 сентября 2008

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

perl -pie 's/\r//g' filename.txt
7 голосов
/ 15 сентября 2008

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

dos2unix [опции] [-c конвойд] [-о файл ...] [-n инфильный файл ...]

5 голосов
/ 15 сентября 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.  
4 голосов
/ 17 апреля 2013

Для замены символов ^ 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)
...