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

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

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

Ответ 1

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

Ответ 2

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

:set fileformat=unix

:w

Ответ 3

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

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

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

Ответ 4

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

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

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

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

Затем для записи и выхода введите ":wq" Готово!

Ответ 5

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

Ответ 6

В vi, выполните :%s/^M//g

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

Ответ 7

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

perl -pie 's/\r//g' filename.txt

Ответ 8

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

dos2unix [options] [-c convmode] [-o file...] [-n infile outfile...]

Ответ 9

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.  

Ответ 10

Чтобы заменить символы ^ 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)

Ответ 11

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

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

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

unix для dos:

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

Ответ 12

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

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

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

rm -v *.bak

Ответ 14

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

Ответ 15

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

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

Мои два цента

Ответ 16

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