it-swarm-ru.tech

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

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

Что является причиной этого и как я могу это исправить?

96
Paul Reiners

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

77
Thomas Owens

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

:set fileformat=unix

:w

74
Tim Abell

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

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

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

39
ColinYounger

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

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

Затем нажмите ":", чтобы перейти в командный режим.

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

Затем, чтобы написать и выйти, введите ":wq" Готово!

24
Bernie Perez

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

13
Andy Whitfield

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

Чтобы получить ^M, удерживайте CTRL нажатие клавиши V затем M (И удерживая клавишу управления) и ^M появится. Это найдет все вхождения и заменит их ничем.

9
dogbane

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

Perl -pie 's/\r//g' filename.txt
8
Bill the Lizard

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

dos2unix [опции] [-c конвойд] [-о файл ...] [-n инфильный файл ...]

7
jW.
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.  
5
JGurtz

Для замены символов ^ 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)
4
leeladharan acharya

Альтернативой команде dos2unix было бы использование стандартных утилит, таких как sed.

Например, dos to unix:

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

unix to DOS:

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

Преобразовать окончания строк DOS/Windows (\ r\n) в окончания строк Unix (\ n) с помощью tr:

tr '\r\n' '\n' < dosFile.txt > unixFile.txt

Пост о замене перевода строки из командной строки Unix

1
Mason Wright

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

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

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

rm -v *.bak
1
kenorb

В Perl, если вы не хотите устанавливать переменную $/и использовать chomp (), вы также можете сделать:

$var =~ /\r\n//g;

Мои два цента

0
Ariel Monaco

od -a $file полезен для изучения вопросов такого типа в Linux (аналогично dumphex выше).

0
Allan Wind