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