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


Попробуйте использовать dos2unix, чтобы удалить ^ M.
Это вызвано символами конца строки DOS / Windows. Как сказал Энди Уитфилд, команда dos2unix в Unix поможет решить эту проблему. Если вам нужна дополнительная информация, вы можете прочитать страницы руководства по этой команде.
Вы можете легко получить инструмент на OSX с brew install dos2unix, когда у вас установлен homebrew
^ 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?
Я просто предлагаю альтернативу, поскольку четыре человека уже сказали использовать dos2unix.
Да, я нашел это полезным, потому что я работаю на отсталой рабочей станции в офисе с доисторическим ИТ-отделом. За исключением того, что я использовал вариант: perl -pi -e "s / \ x0D / \ n / g" file.csv
В vi сделайте :%s/^M//g
Чтобы заставить ^M удерживать клавишу CTRL, нажмите V, затем M (оба при удерживании клавиши управления), и появится ^M. Это найдет все вхождения и ничего не заменит.
Чтобы заменить ^ M на дружественный к unix разрыв строки: :%s/^M/\r/g
Причина в различии между тем, как ОС на базе Windows и ОС на базе Unix хранят маркеры конца строки.
Операционные системы на базе Windows, благодаря их наследию DOS, хранят конец строки в виде пары символов - 0x0D0A (возврат каретки + перевод строки). Операционные системы на основе Unix просто используют 0x0A (перевод строки). ^M, который вы видите, является визуальным представлением 0x0D (возврат каретки).
dos2unix поможет в этом. Возможно, вам также потребуется настроить источник скриптов, чтобы он был «дружественным к Unix».
Я бы не сказал, что в текущих версиях Windows есть какая-либо DOS наследство. Однако у них все еще есть ограничения совместимости.
Это простой способ, если вы создадите инструмент автоматического преобразования. Спасибо
Но почему ^M? Почему "^"? Почему «М»?
Потому что это «управляющий персонаж». «^» - это визуальное представление нажатия клавиши управления. Под его просто конкретными байтами ^ - это то, как редактор представляет их.
Самый простой способ - использовать vi. Я знаю, это звучит ужасно, но прост и уже установлен в большинстве сред UNIX. ^ M - это новая строка из среды Windows / DOS.
из командной строки: $ vi filename
Затем нажмите «:», чтобы перейти в командный режим.
Искать и заменить все глобально - это :%s/^M//g "Нажмите и удерживайте элемент управления, затем нажмите V, затем
M", который заменяет ^ M ничем.
Затем, чтобы написать и выйти, введите «:wq» Готово!
Как заменить его в emacs?
Спасибо за объяснение того, как вводить символ ^ M! Вместо этого я бы заменил его на \ r. Так я и сделал:% s / ^ M / \ r / g
Подойдет еще одна команда vi: :%s/.$// Удаляет последний символ каждой строки файла. Недостатком этой команды поиска и замены является то, что ей все равно, какой будет последний символ, поэтому будьте осторожны, чтобы не вызывать его дважды.
Зачем упоминать об этом, если вы знаете, что это ненадежно?
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, инструмента, который я, вероятно, использовал бы только один раз)
по какой-то причине это не удаляет ^M. справочный файл: /etc/timidity/fluidr3_gm.cfg.
В 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, просто повторить макрос для количества строк в файле.
Альтернативой команде 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
В некоторых системах (например, Ubuntu) эта команда называется fromdos.