16 ответов:
Это вызвано символами окончания строки DOS / Windows. Как сказал Энди Уитфилд, команда Unix dos2unix поможет решить эту проблему. Если вам нужна дополнительная информация, вы можете прочитать справочные страницы для этой команды.
причина заключается в разнице между тем, как ОС на базе 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" сделать!
сценарий 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.txtSed еще более широко доступен и может делать такие вещи также, если 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/gin above ^M is not (shift + 6)M instead it is (ctrl + V)(ctrl + M)
альтернатива
dos2unixкоманда будет использовать стандартные утилиты, такие какsed.например, dos для unix:
sed 's/\r$//' dos.txt > unix.txtunix 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
в Perl, если вы не хотите устанавливать переменную $/ и использовать chomp (), вы также можете сделать:
$var =~ /\r\n//g;мои два цента
еще одна команда vi, которая будет делать:
:%s/.$//при этом удаляется последний символ каждой строки в файле. Недостатком этой команды поиска и замены является то, что ей все равно, какой последний символ, поэтому будьте осторожны, чтобы не вызвать его дважды.
Comments