Символ '^ M' в кінці рядків


99

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

Що викликає це і як це виправити?

Відповіді:


79

Його спричиняють символи закінчення рядків DOS / Windows. Як сказав Енді Вітфілд, команда Unix dos2unix допоможе вирішити проблему. Якщо ви хочете отримати додаткову інформацію, ви можете прочитати підручні сторінки для цієї команди.


3
У деяких системах (тобто Ubuntu) назва цієї команди "fromdos"
bobwienholt

6
Ви можете отримати інструмент на OSX дуже легко, brew install dos2unixколи встановлено домашню мову
philipp

73

Виправте закінчення рядка, viвиконавши наступне:

:set fileformat=unix

:w


2
Це геніальна відповідь. Велике дякую. (збережено встановлення dos2unix, інструмент, який я, мабуть, використовував би лише один раз)
Джамсі

3
це не видаляє ^Ms з якоїсь причини. посилання на файл: /etc/timidity/fluidr3_gm.cfg.
phil294

39

Причиною є різниця між тим, як ОС на базі Windows та ОС на основі Unix зберігають маркери кінцевих рядків.

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

У цьому допоможе dos2unix . Можливо, вам також потрібно налаштувати джерело сценаріїв, щоб вони були "Unix-friendly".


Я б не сказав, що поточні версії Windows мають будь-яку спадщину DOS . Однак вони все ще мають обмеження щодо сумісності.
Джої

Це простий спосіб, чи ви робите інструмент автоматичного перетворення. Дякуємо
Pjl

Але чому ^M? Чому "^"? Чому "М"?
1737973

Тому що це "контрольний персонаж". "^" - це візуальне зображення натискання клавіші управління. Під його просто конкретними байтами ^ - це те, як редактор їх представляє.
Hejazzman

24

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

з командного рядка: $ vi filename

Потім натисніть " :", щоб перейти до командного режиму.

Шукати та замінювати все на глобальному рівні - :%s/^M//g" Натисніть і утримуйте контроль, потім натисніть V, потім M ", що замінить ^ M нічим.

Потім написати та кинути ввести " :wq" Готово!


Як замінити його в emacs?
herbertD

Дякую! VI (М) чудово!
Ionică Bizău

3
Дякуємо за розширення щодо введення символу ^ М! Я б замінив його на \ r замість цього. Так я і зробив:% s / ^ M / \ r / g
aharris88


10

У vi, зробіть :%s/^M//g

Щоб отримати клавішу ^Mутримування CTRL, натисніть Vпотім M(обидва, утримуючи клавішу управління), і ^Mз'явиться повідомлення. Це знайде всі події і замінить їх нічим.


2
Щоб замінити ^ M на unix дружній розрив лінії::%s/^M/\r/g
Gary Oak

8

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

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

Звичайно, ви можете використовувати perl, але ви б запропонували perl над dos2unix?
Томас Оуенс

2
Я просто пропоную альтернативу, оскільки чотири людини вже сказали, що використовують dos2unix.
Білл Ящірка

2
Так, я вважаю це корисним, бо перебуваю на відсталій робочій станції, працюючи в офісі з доісторичним відділом ІТ. За винятком того, що я використовував варіант: perl -pi -e "s / \ x0D / \ n / g" file.csv
Ріміан

7

^ M, як правило, викликається новими рядками оператора Windows, а переклад на Unix виглядає як ^ M. Команда dos2unix повинна добре їх видалити

dos2unix [параметри] [-c convmode] [-o файл ...] [-n infile outfile ...]


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

4

Для заміни ^ 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)

Ваш останній рядок - це те, чого я бракував у всіх попередніх відповідях. Я постійно отримував "не знайдено жодних відповідей. Bc я робив зсув + 6, тому я робив те, що хотів би кожен хакер, і обійшов своє непорозуміння своїм власним рішенням: запишіть макрос, щоб зробити $, щоб перейти до кінця кожного рядка, а потім натисніть x, просто повторити макрос для кількості рядків у файлі.
поспішає

3

Альтернативою dos2unixкоманді буде використання стандартних утиліт типу sed.

Наприклад, dos до unix:

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

unix до dos:

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

1

Ви можете видалити ^ M з файлів безпосередньо за допомогою команди sed, наприклад:

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

Якщо ви задоволені змінами, видаліть .bak файли:

rm -v *.bak


0

od -a $file корисно вивчити такі типи питань у Linux (подібні до dumphex у вищевказаному).


0

У Perl, якщо ви не хочете встановлювати $ / змінну та використовувати chomp (), ви також можете зробити:

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

Мої два центи


-1

Ще одна команда vi, яка буде виконана: :%s/.$// Це видаляє останній символ кожного рядка у файлі. Недоліком цієї команди пошуку та заміни є те, що їй не байдуже, що є останнім символом, тому будьте обережні, щоб не викликати його двічі.


Навіщо згадувати це, якщо ви знаєте, що це не надійно?
minexew
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.