`^ M` là gì và làm thế nào để tôi thoát khỏi nó?


134

Khi tôi mở tập tin vim, tôi thấy những ^Mký tự lạ .

Thật không may, công cụ tìm kiếm yêu thích của thế giới không hoạt động tốt với các ký tự đặc biệt trong các truy vấn, vì vậy tôi đang hỏi ở đây:

  • ^MNhân vật này là gì?

  • Làm thế nào nó có thể có được ở đó?

  • Làm sao để tôi bỏ nó đi?


3
Vlastimil đó là một chỉnh sửa vô nghĩa. Có thì quá khứ đúng của tiếng Anh.
Jesse_b

1
Đó là một sơ đồ ký tự điều khiển, để biết thêm : help digraph-table.
Eric Leschinski

Câu trả lời:


108

Đây ^Mlà một nhân vật trở về xe ngựa. Nếu bạn thấy điều này, có lẽ bạn đang xem một tệp có nguồn gốc trong thế giới DOS / Windows, nơi một dòng cuối được đánh dấu bằng cặp trả về vận chuyển / dòng mới, trong khi ở thế giới Unix, cuối dòng được đánh dấu bởi một dòng mới.

Đọc bài viết này để biết thêm chi tiết, và cũng là mục Wikipedia cho dòng mới .

Bài viết này thảo luận về cách thiết lập vim để chỉnh sửa các tệp trong suốt với các điểm đánh dấu cuối dòng khác nhau.

Nếu bạn có một tệp có ^Mở cuối một số dòng và bạn muốn loại bỏ chúng, hãy sử dụng tệp này trong Vim:

:s/^M$//

(Nhấn Ctrl+ V Ctrl+ Mđể chèn ^M.)


11
:%s/^M/\r/gThay vào đó hãy thử loại bỏ ^Mvà thay thế ^Mbằng ký tự dòng mới \r. Không có %, lệnh chỉ áp dụng cho dòng hiện tại. Và tôi đã bắt gặp một số ví dụ ^Mkhông ở cuối dòng, chẳng hạn nhưThe first line.^MThe second line.
George

Hoặc nếu bạn không muốn có vô số ngắt dòng, bạn chỉ có thể làm:%s/^M/
cẩn thận1

2
Nếu nó chỉ là một cỗ xe trở về, thì đó có thể là dòng ngắt Macintosh cổ điển (tiền Unix). Ngay cả một số chương trình mới hơn như Excel 2007 cho Mac cũng làm điều đó vì một số lý do.
sudo

@larsks Nhưng altap.cz/salamander/help/salamand/appcill_txtfiles nói rằng nó ^Mđược sử dụng trong UNIX
Vivek

Bài viết mà bạn đã liên kết nói rằng \nđược sử dụng trong Unix, đúng. Đó là mã ASCII 10, còn được gọi là ^J.
larsks

39

Hầu hết các hệ điều hành UNIX đều có một tiện ích được gọi là dos2unixsẽ chuyển đổi CRLF thành LF. Các câu trả lời khác bao gồm câu hỏi "họ là gì".


36

Một cách đơn giản hơn để làm điều này là sử dụng lệnh sau:

dos2unix filename

Lệnh này cũng hoạt động với các mẫu đường dẫn, vd

dos2unix path/name*

Nếu nó không hoạt động, hãy thử sử dụng chế độ khác nhau:

dos2unix -c mac filename
  • -cĐặt chế độ chuyển đổi. Trong đó CONVMODE là một trong số: ascii, 7bit, iso, macvới asciimặc định.

22

Điều này làm việc cho tôi

:e ++ff=dos 

Lệnh: e ++ ff = dos yêu cầu Vim đọc lại tệp, buộc định dạng tệp dos. Vim sẽ loại bỏ các kết thúc dòng chỉ CRLF và LF, chỉ để lại văn bản của mỗi dòng trong bộ đệm.

sau đó

:set ff=unix 

và cuối cùng

:wq 

3
cảm ơn! điều này hiệu quả với tôi nhưng giải pháp được chấp nhận đã không
Người hâm mộ số một của Bjork

ffđề cập đến định dạng tập tin? Thế còn ++ff?
KcFnMi

Lệnh: e ++ ff = dos yêu cầu Vim đọc lại tệp, buộc định dạng tệp dos. Vim sẽ loại bỏ các kết thúc dòng chỉ CRLF và LF, chỉ để lại văn bản của mỗi dòng trong bộ đệm.
Stryker

10

Một cách khác để thoát khỏi trả lại vận chuyển là với trlệnh.

Tôi có một kịch bản nhỏ trông như thế này

#!/bin/sh
tmpfile=$(mktemp)
tr -d '\r' <"$1" >"$tmpfile"
mv "$tmpfile" "$1"

6

Bạn có thể làm sạch điều này với sed:

sed -e 's/^M$//' < infile > outfile

Bí quyết là làm thế nào để vào xe ngựa trở về đúng cách. Nói chung, bạn cần gõ C-v C-mđể nhập trở lại vận chuyển theo nghĩa đen. Bạn cũng có thể có công việc sed tại chỗ với

sed -i.bak -e 's/^M$//' infile

2

Đây là gì ^ M?
^ M là một nhân vật trở về xe ngựa. Nếu bạn thấy điều này, có lẽ bạn đang xem một tệp có nguồn gốc trong thế giới DOS / Windows, nơi một dòng cuối được đánh dấu bằng cặp trả về vận chuyển / dòng mới, trong khi ở thế giới Unix, cuối dòng được đánh dấu bởi một dòng mới.

Làm thế nào nó có thể có được ở đó?
Khi có sự thay đổi trong định dạng tập tin.

Làm sao để tôi bỏ nó đi?
mở tập tin của bạn với

vim -b FILE_PATH

lưu nó với lệnh sau

:%s/^M//g

Bạn đã có một lỗi đánh máy trong việc mở filr của bạn với .
Mateusz Piotrowski

4
Câu trả lời này không thêm bất cứ điều gì vào các câu trả lời khác. Đoạn đầu tiên là một bản sao gần như nguyên văn từ câu trả lời được chấp nhận. Mã đã cho sẽ không lưu bất cứ thứ gì, mà chỉ xóa tất cả các ký tự trả về vận chuyển khỏi tất cả các dòng. Và tôi không chắc việc mở tệp ở chế độ nhị phân sẽ giúp ích như thế nào ở đây.
Dubu

2

Trong trường hợp của tôi,

Không có gì ở trên hoạt động, tôi đã có một tệp CSV được sao chép vào máy Linux từ máy mac của tôi và tôi đã sử dụng tất cả các lệnh trên nhưng không có gì giúp được ngoài lệnh dưới đây

tr "\015" "\n" < inputfile > outputfile

Tôi đã có một tập tin trong đó ^ Các ký tự M được trộn lẫn giữa các dòng giống như bên dưới

Audi,A4,35 TFSi Premium,,CAAUA4TP^MB01BNKT6TG,TRO_WBFB_500,Trico,CARS,Audi,A4,35 TFSi Premium,,CAAUA4TP^MB01BNKTG0A,TRO_WB_T500,Trico,

0

Bạn có thể sử dụng Vim trong chế độ Ex:

ex -bsc '%s/\r//|x' file
  1. -b chế độ nhị phân

  2. % chọn tất cả các dòng

  3. s thay thế

  4. \r vận chuyển trở lại

  5. x lưu và đóng


0

Thêm dòng sau vào ~ / .vimrc của bạn

command! Tounix :call Preserve('1,$s/^M//')

Sau đó, khi bạn có một tệp có kết thúc dòng Windows, hãy chạy lệnh ": Tounix".


-1

Trước đây, tôi đã thấy các tệp cấu hình thậm chí không được phân tích cú pháp đúng và phàn nàn về khoảng trắng, nhưng nếu bạn vi và thực hiện một danh sách đã đặt, nó sẽ không hiển thị khoảng trắng, tên tệp grep [[dấu cách]] sẽ hiển thị cho bạn ^ M

đó là khi dos2unix filegiúp


Câu trả lời này không mang lại điều gì mới, does2unix đã được đề cập ít nhất trong hai câu trả lời cũ hơn nhiều.
Rui F Ribeiro
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.