Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: CommunityОтветов: 12

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

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

sqlnewlineunixline-endingsos-dependent

Ответы

Ответ 1 · рейтинг 80 · Thomas Owens

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

Ответ 2 · рейтинг 76 · Tim Abell

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

:set fileformat=unix

:w

Ответ 3 · рейтинг 39 · ColinYounger

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

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

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

Ответ 4 · рейтинг 24 · Bernie Perez

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

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

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

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

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

Ответ 5 · рейтинг 13 · Andy Whitfield

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

Ответ 6 · рейтинг 10 · dogbane

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

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

Ответ 7 · рейтинг 8 · Bill the Lizard

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

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

Ответ 8 · рейтинг 7 · jW.

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

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

Ответ 9 · рейтинг 5 · Community

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 · рейтинг 4 · Community

Чтобы заменить символы ^ 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 · рейтинг 3 · Community

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

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

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

unix для dos:

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

Ответ 12 · рейтинг 1 · Community

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

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

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

rm -v *.bak

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы