Коли я запускаю певний скрипт SQL в середовищах Unix, я бачу символ '^ M' в кінці кожного рядка сценарію SQL, оскільки він перегукується з командним рядком. Я не знаю, для якої ОС був створений сценарій SQL.
Що викликає це і як це виправити?
Коли я запускаю певний скрипт SQL в середовищах Unix, я бачу символ '^ M' в кінці кожного рядка сценарію SQL, оскільки він перегукується з командним рядком. Я не знаю, для якої ОС був створений сценарій SQL.
Що викликає це і як це виправити?
Відповіді:
Його спричиняють символи закінчення рядків DOS / Windows. Як сказав Енді Вітфілд, команда Unix dos2unix допоможе вирішити проблему. Якщо ви хочете отримати додаткову інформацію, ви можете прочитати підручні сторінки для цієї команди.
brew install dos2unix
коли встановлено домашню мову
Виправте закінчення рядка, vi
виконавши наступне:
:set fileformat=unix
:w
^M
s з якоїсь причини. посилання на файл: /etc/timidity/fluidr3_gm.cfg
.
Причиною є різниця між тим, як ОС на базі Windows та ОС на основі Unix зберігають маркери кінцевих рядків.
Операційні системи на базі Windows, завдяки спадщині DOS, зберігають кінець рядка як пару символів - 0x0D0A
(повернення каретки + канал каналу). Операційні системи на основі Unix просто використовують 0x0A
( рядок каналу ). ^M
Ви бачите це візуальне уявлення0x0D
(а повернення каретки ).
У цьому допоможе dos2unix . Можливо, вам також потрібно налаштувати джерело сценаріїв, щоб вони були "Unix-friendly".
^M
? Чому "^"? Чому "М"?
Найпростіший спосіб - це використовувати vi
. Я знаю, що це звучить жахливо, але його просто та вже встановлено у більшості середовищ UNIX. ^ M - це новий рядок із середовища Windows / DOS.
з командного рядка: $ vi filename
Потім натисніть " :
", щоб перейти до командного режиму.
Шукати та замінювати все на глобальному рівні - :%s/^M//g
" Натисніть і утримуйте контроль, потім натисніть V, потім M ", що замінить ^ M нічим.
Потім написати та кинути ввести " :wq
" Готово!
Спробуйте скористатися dos2unix, щоб зняти ^ M.
Скрипт SQL спочатку був створений в ОС Windows. Символи '^ M' є результатом того, що Windows та Unix мають різні уявлення про те, що використовувати для символу кінця рядка. Ви можете скористатися perl в командному рядку, щоб виправити це.
perl -pie 's/\r//g' filename.txt
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)
Перетворити закінчення рядків DOS / Windows (\ r \ n) у закінчення рядків Unix (\ n), з tr:
tr '\r\n' '\n' < dosFile.txt > unixFile.txt
od -a $file
корисно вивчити такі типи питань у Linux (подібні до dumphex у вищевказаному).
У Perl, якщо ви не хочете встановлювати $ / змінну та використовувати chomp (), ви також можете зробити:
$var =~ /\r\n//g;
Мої два центи
Ще одна команда vi, яка буде виконана: :%s/.$//
Це видаляє останній символ кожного рядка у файлі. Недоліком цієї команди пошуку та заміни є те, що їй не байдуже, що є останнім символом, тому будьте обережні, щоб не викликати його двічі.