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

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

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

ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
99
0
111 804
16
Перейти к ответу Данный вопрос помечен как решенный

Ответы 16

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

Ответ принят как подходящий

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

В некоторых системах (например, Ubuntu) эта команда называется fromdos.

bobwienholt 04.12.2012 20:12

Вы можете легко получить инструмент на OSX с brew install dos2unix, когда у вас установлен homebrew

philipp 12.06.2013 21:04

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

dos2unix [параметры] [-c convmode] [-o файл ...] [-n файл выходного файла ...]

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

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

Конечно, вы МОЖЕТЕ использовать perl, но не могли бы вы предложить perl вместо dos2unix?

Thomas Owens 15.09.2008 21:11

Я просто предлагаю альтернативу, поскольку четыре человека уже сказали использовать dos2unix.

Bill the Lizard 15.09.2008 21:17

Да, я нашел это полезным, потому что я работаю на отсталой рабочей станции в офисе с доисторическим ИТ-отделом. За исключением того, что я использовал вариант: perl -pi -e "s / \ x0D / \ n / g" file.csv

Rimian 11.02.2010 02:36

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

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

Чтобы заменить ^ M на дружественный к unix разрыв строки: :%s/^M/\r/g

Gary Oak 26.02.2014 23:46

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

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

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

Я бы не сказал, что в текущих версиях Windows есть какая-либо DOS наследство. Однако у них все еще есть ограничения совместимости.

Joey 08.03.2013 16:30

Это простой способ, если вы создадите инструмент автоматического преобразования. Спасибо

Pjl 09.04.2015 16:57

Но почему ^M? Почему "^"? Почему «М»?

1737973 28.07.2015 07:47

Потому что это «управляющий персонаж». «^» - это визуальное представление нажатия клавиши управления. Под его просто конкретными байтами ^ - это то, как редактор представляет их.

Hejazzman 06.08.2015 01:10

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

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

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

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

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

Как заменить его в emacs?

herbertD 01.11.2013 07:09

Спасибо за объяснение того, как вводить символ ^ M! Вместо этого я бы заменил его на \ r. Так я и сделал:% s / ^ M / \ r / g

aharris88 24.11.2014 23:05

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

Зачем упоминать об этом, если вы знаете, что это ненадежно?

minexew 07.02.2014 20:10

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.  

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

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

:set fileformat=unix

:w

Это блестящий ответ. Большое спасибо. (сохранена установка dos2unix, инструмента, который я, вероятно, использовал бы только один раз)

Jamsi 05.02.2014 02:29

по какой-то причине это не удаляет ^M. справочный файл: /etc/timidity/fluidr3_gm.cfg.

phil294 06.04.2017 04:11

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

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

Мои два цента

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

Ваша последняя строка - это то, чего мне не хватало во всех предыдущих ответах. Я продолжал получать 'совпадений не найдено, потому что я делал shift + 6, поэтому я сделал то, что делал каждый хакер, и обошел свое недоразумение своим собственным решением: записал макрос, чтобы сделать $, чтобы перейти к концу каждой строки, а затем нажмите x, просто повторить макрос для количества строк в файле.

darethas 13.08.2013 09:46

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

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

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

unix для dos:

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

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

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

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

rm -v *.bak

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

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

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

Другие вопросы по теме