it-swarm-vi.tech

Ký tự '^ M' ở cuối dòng

Khi tôi chạy một tập lệnh SQL cụ thể trong môi trường Unix, tôi đang thấy một ký tự '^ M' ở cuối mỗi dòng của tập lệnh SQL khi nó được lặp lại theo dòng lệnh. Tôi không biết kịch bản SQL nào được tạo ban đầu.

Điều gì gây ra điều này và làm cách nào để khắc phục nó?

97
Paul Reiners

Nó gây ra bởi các ký tự kết thúc dòng DOS/Windows. Giống như Andy Whitfield đã nói, lệnh Unix dos2unix sẽ giúp khắc phục vấn đề. Nếu bạn muốn biết thêm thông tin, bạn có thể đọc các trang man cho lệnh đó.

77
Thomas Owens

Khắc phục kết thúc dòng trong vi bằng cách chạy như sau:

:set fileformat=unix

:w

74
Tim Abell

Nguyên nhân là do sự khác biệt giữa cách hệ điều hành dựa trên Windows và hệ điều hành dựa trên Unix lưu trữ các điểm đánh dấu cuối dòng.

Các hệ điều hành dựa trên Windows, nhờ vào di sản DOS của họ, lưu trữ một dòng cuối là một cặp ký tự - 0x0D0A (trả về vận chuyển + nguồn cấp dữ liệu). Các hệ điều hành dựa trên Unix chỉ cần sử dụng 0x0A (a nguồn cấp dữ liệ ). ^M bạn đang thấy là một đại diện trực quan của 0x0D (a trả lại xe ngựa ).

dos2unix sẽ giúp với điều này. Có lẽ bạn cũng cần điều chỉnh nguồn của các tập lệnh để trở nên 'thân thiện với Unix'.

39
ColinYounger

Cách dễ nhất là sử dụng viTôi biết rằng nghe có vẻ khủng khiếp nhưng nó đơn giản và đã được cài đặt trên hầu hết các môi trường UNIX. ^ M là một dòng mới từ môi trường Windows/DOS.

từ lệnh Nhắc: $ vi filename

Sau đó nhấn ":" để đến chế độ lệnh.

Tìm kiếm và Thay thế tất cả Toàn cầu là :%s/^M//g "Nhấn và giữ điều khiển sau đó nhấn V rồi M" sẽ thay thế ^ M không có gì.

Sau đó, để viết và thoát, nhập ":wq" Xong!

24
Bernie Perez

Hãy thử sử dụng dos2unix để loại bỏ ^ M.

13
Andy Whitfield

Trong vi, hãy thực hiện :%s/^M//g

Để lấy ^M giữ CTRL phím, nhấn V sau đó M (Cả khi giữ phím điều khiển) và ^M sẽ xuất hiện. Điều này sẽ tìm thấy tất cả các lần xuất hiện và thay thế chúng không có gì.

9
dogbane

Tập lệnh SQL ban đầu được tạo trên HĐH Windows. Các ký tự '^ M' là kết quả của Windows và Unix có các ý tưởng khác nhau về những gì sẽ sử dụng cho một nhân vật cuối dòng. Bạn có thể sử dụng Perl tại dòng lệnh để sửa lỗi này.

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

^ M thường được gây ra bởi các dòng mới của toán tử Windows và được dịch sang Unix trông giống như ^ M. Lệnh dos2unix sẽ loại bỏ chúng một cách độc đáo

dos2unix [tùy chọn] [-c confmode] [-o file ...] [-n infile outfile ...]

7
jW.
C:\tmp\text>dos2unix hello.txt helloUNIX.txt

Sed thậm chí còn có sẵn rộng rãi hơn và cũng có thể làm điều này nếu dos2unix không được cài đặt

C:\tmp\text>sed s/\r// hello.txt > helloUNIX.txt  

Bạn cũng có thể thử tr:

cat hello.txt | tr -d \r > helloUNIX2.txt  

Đây là kết quả:

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

Để thay thế ^ M ký tự trong trình soạn thảo vi sử dụng bên dưới

mở tệp văn bản nói t1.txt

vi t1.txt

Vào chế độ lệnh bằng cách nhấn shift + :

sau đó nhấn các phím như đã đề cập %s/^M/\r/g

in above ^M is not (shift + 6)M instead it is (ctrl + V)(ctrl + M)
4
leeladharan acharya

Một thay thế cho lệnh dos2unix sẽ sử dụng các tiện ích tiêu chuẩn như sed.

Ví dụ: dos to unix:

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

unix to dos:

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

Chuyển đổi các kết thúc dòng DOS/Windows (\ r\n) thành các kết thúc dòng Unix (\ n), với tr:

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

Đăng bài về việc thay thế dòng mới từ dòng lệnh Unix

1
Mason Wright

Bạn có thể xóa ^ M khỏi các tệp trực tiếp thông qua lệnh sed, ví dụ:

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

Nếu bạn hài lòng với các thay đổi, hãy xóa các tệp .bak:

rm -v *.bak
1
kenorb

Trong Perl, nếu bạn không muốn đặt $/biến và sử dụng chomp (), bạn cũng có thể thực hiện:

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

Theo quan điểm của tôi

0
Ariel Monaco

od -a $file rất hữu ích để khám phá các loại câu hỏi trên Linux (tương tự như dumphex ở trên).

0
Allan Wind