Вопрос

Когда я запускаю определенный сценарий 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/.$// При этом удаляется последний символ каждой строки файла.Недостаток этой команды поиска и замены заключается в том, что ей не важно, какой символ будет последним, поэтому будьте осторожны, не вызывайте ее дважды.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top