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



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



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

1290   16  

16 ответов:

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

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

:set fileformat=unix

:w

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

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

dos2unix поможет с этим. Вероятно, вам также нужно настроить источник сценариев, чтобы быть "Unix-friendly".

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

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

затем нажмите ": " для перехода в командный режим.

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

затем написать и выйти введите":wq" сделать!

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

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

для получения ^M провести CTRL

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

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

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

dos2unix [options] [- c convmode] [- o file ...] [-Н входной_файл выходной_файл ...]

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 для unix:

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

unix to dos:

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

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

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

Если вы довольны изменениями, удалите их .бак файлы:

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

Comments

    Ничего не найдено.