Когда я запускаю определенный SQL script в средах Unix, я вижу символ "^ M" в конце каждой строки SQL script, поскольку он отображается в командной строке. Я не знаю, на какой ОС был создан SQL script.
Что вызывает это и как его исправить?
Когда я запускаю определенный SQL script в средах Unix, я вижу символ "^ M" в конце каждой строки SQL script, поскольку он отображается в командной строке. Я не знаю, на какой ОС был создан SQL script.
Что вызывает это и как его исправить?
Это вызвано символами конца строки DOS/Windows. Как сказал Энди Уитфилд, команда Unix dos2unix поможет исправить эту проблему. Если вам нужна дополнительная информация, вы можете прочитать страницы руководства для этой команды.
Исправьте окончания строки в vi
, выполнив следующее:
:set fileformat=unix
:w
Причина заключается в различии между тем, как ОС на базе Windows и ОС на базе Unix хранят маркеры конца строки.
Операционные системы на базе Windows, благодаря своему наследию DOS, сохраняют конец строки как пару символов - 0x0D0A
(возврат каретки + линия). Операционные системы, основанные на Unix, просто используют 0x0A
(a line feed). ^M
, который вы видите, представляет собой визуальное представление 0x0D
(a возврат каретки).
dos2unix поможет в этом. Вероятно, вам также необходимо настроить источник сценариев как "Unix-friendly".
Самый простой способ - использовать vi
. Я знаю, что это звучит ужасно, но прост и уже установлен в большинстве сред UNIX. ^ M - новая строка из среды Windows/DOS.
из командной строки: $ vi filename
Затем нажмите ":
", чтобы перейти в командный режим.
Поиск и замена всех во всем мире :%s/^M//g
" Нажмите и удерживайте нажатой клавишу, затем нажмите V, затем
M ", который заменит ^ M ничем.
Затем для записи и выхода введите ":wq
" Готово!
Попробуйте использовать dos2unix, чтобы отключить ^ M.
В vi, выполните :%s/^M//g
Чтобы получить ^M
, удерживайте клавишу CTRL, нажмите V, затем M (оба удерживайте клавишу управления), и появится ^M
. Это найдет все вхождения и ничего не заменит.
SQL script изначально был создан в ОС Windows. Символы '^ M' являются результатом того, что Windows и Unix имеют разные представления о том, что использовать для символа конца строки. Вы можете использовать perl в командной строке, чтобы исправить это.
perl -pie 's/\r//g' filename.txt
The ^ M обычно вызван новыми символами оператора Windows, а перевод на Unix выглядит как ^ M. Команда dos2unix должна удалить их красиво
dos2unix [options] [-c convmode] [-o file...] [-n infile outfile...]
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.
Чтобы заменить символы ^ 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)
Альтернативой команде dos2unix
будет использование стандартных утилит, таких как sed
.
Например, dos to 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
od -a $file
полезен для изучения этих типов вопросов в Linux (аналогично dumphex в приведенном выше).
В Perl, если вы не хотите устанавливать переменную $/и использовать chomp(), вы также можете:
$var =~ /\r\n//g;
Мои два цента
Другая команда vi, которая будет делать: :%s/.$//
Это удаляет последний символ каждой строки в файле. Недостатком этой команды поиска и замены является то, что ей все равно, что такое последний символ, поэтому будьте осторожны, чтобы не вызывать его дважды.