Làm cách nào để chuyển đổi ngắt dòng ^ M thành ngắt dòng 'bình thường' trong một tệp được mở trong vim?


481

vim hiển thị trên mỗi dòng kết thúc ^ M

Làm thế nào để tôi thay thế điều này bằng một ngắt dòng 'bình thường'?



3
Vui lòng thay đổi giải pháp thành thay đổi định dạng tệp vì đó là giải pháp sạch nhất.
erikbwork

1
Tôi biết câu hỏi này là về vim, nhưng một số tìm kiếm khác của Google cũng nằm trong chủ đề này. Vì vậy, nếu bạn đã cài đặt Eclipse trên hệ thống của mình, bạn có thể chuyển đổi dấu phân cách dòng cho một tệp duy nhất hoặc một cây thư mục đầy đủ của các tệp với một vài lần nhấp: stackoverflow.com/a/7019737/1364747
Teddy

Tôi thích cách bạn gọi ngắt dòng bình thường là "bình thường" - ngược lại với các ngắt dòng ^ M :-)
DerMike

Câu trả lời:


134

Đây là điều duy nhất làm việc cho tôi:

: e ++ ff = dos

Tìm thấy nó tại: http://vim.wikia.com/wiki/File_format


Đã làm việc trên windows7 Vim7.4
schuess

19
:e ++ff=dostiếp theo :set ff=unixsẽ chuyển đổi các kết thúc thành một định dạng lành mạnh.
Mateen Ulhaq

Phản hồi của Solution không hiệu quả với tôi, chỉ các lệnh @MateenUlhaq giúp tôi.
Edenshaw

577

Chỉ huy

:%s/<Ctrl-V><Ctrl-M>/\r/g

Trong đó <Ctrl-V><Ctrl-M>có nghĩa là loại Ctrl+ Vthì Ctrl+ M.

Giải trình

:%s

thay thế,% = tất cả các dòng

<Ctrl-V><Ctrl-M>

^ M ký tự (Ctrl-V là cách viết Vim của ký tự Ctrl ^ và Ctrl-M viết M sau biểu thức chính quy, dẫn đến ^ M ký tự đặc biệt)

/\r/

với dòng mới ( \r)

g

Và làm điều đó trên toàn cầu (không chỉ là lần đầu tiên xuất hiện trên đường dây).


21
nó đã loại bỏ các ký tự ^ M nhưng không chèn trở lại vận chuyển.
luckytaxi

14
@jumpnett - Bạn cần nhấn các hợp âm phím Ctrl-V / Ctrl-M, không nhập đó dưới dạng văn bản nguyên văn.
LeopardSkinPillBoxHat

33
Đây chắc chắn là câu trả lời đúng cho câu hỏi, nếu bạn có ^ M theo sau bởi một dòng mới, bạn muốn giữ dòng mới nhưng xóa ^ M. Thực hiện thay thế khác bên dưới không gian đôi tập tin của bạn.
dlamblin

12
Nếu bạn vẫn còn thiếu trả lại xe ngựa (tức là ^ M đã bị xóa nhưng mọi thứ được gói trên một dòng duy nhất), hãy làm: :%s/<Ctrl-V><Ctrl-M>/\r/g(trong đó \ r thay thế ^ M bằng một dòng mới).
William Turrell

7
Nếu bạn đang chạy Vim trên Windows, thì bạn sẽ cần sử dụng <Ctrl-Q> thay vì <Ctrl-V>.
GrandAdmirus

418

Trên Linux và Mac OS, các công việc sau đây,

:%s/^V^M/^V^M/g

trong đó ^V^Mcó nghĩa là loại Ctrl+ V, sau đó Ctrl+ M.

Lưu ý: trên Windows bạn có thể muốn sử dụng ^Qthay vì ^V, theo mặc định ^Vđược ánh xạ để dán văn bản.


3
Tại sao điều này nhận được một downvote? Nó hoạt động, ngay cả khi tệp của bạn bị nghiền nát trên một dòng vì nó có kết thúc dòng sai.
Paul Tomblin

2
Không. Cách của tôi thay thế bất cứ thứ gì là đầu dòng trong tệp bằng đầu dòng chính xác.
Paul Tomblin

7
Đây là một vấn đề khác khi tệp của bạn KHÔNG có dòng mới trong đó, điều mà tôi thừa nhận là phổ biến hơn. FYI ^ M có thể được khớp với \ r
dlamblin

12
Đây là một lệnh bí ẩn sâu sắc, nhưng nó hoạt động với tôi trên máy mac.
Eric Walker

5
Tôi thấy tương đương %s/\r/\r/ghoạt động tốt trên MacVim cho một tệp chỉ hiển thị ^Mở cuối dòng (một dòng dài theo thuật ngữ MacVim). Rõ ràng \ r có nghĩa là những thứ khác nhau trong mẫu so với các bộ phận thay thế của lệnh này.
RichVel

184

Trong vim, nhìn vào định dạng tệp - DOS hoặc Unix:

:set filetype=unix

:set fileformat=unix

Các tập tin sẽ được viết lại mà không có ký tự trở lại vận chuyển (CR, ^ M).


3
use: set fileformat = unix Đối với hầu hết các cấu hình filetype chỉ thay đổi loại cú pháp đang được sử dụng.
derGral

6
Điều này đã sửa lỗi tôi gặp phải ... Vim bắt đầu nghĩ rằng tệp định dạng UNIX của tôi là các cửa sổ và các dòng mới được thay đổi đang hiển thị ^ M trong git diff.
Thomas Hunter II

Phải phụ thuộc hệ thống. Hôm nay, cái này làm việc. Lệnh set được thực hiện trong vim, btw.
gbarry

1
thật tuyệt! vì fileformat là dos, hãy đặt nó thành unix, và nó ổn thôi
zhaozhi

3
Điều này cũng hoạt động trên vi BTW và bạn có thể thực hiện set ff=unixnhư một phím tắt nhỏ theo cách tương tự ftlà một phím tắt chofiletype
Posva

110

Một tệp tôi đã tạo bằng BBEdit được thấy trong MacVim đang hiển thị một loạt các ^Mtrả về dòng thay vì các tệp thông thường. Chuỗi sau thay thế đã giải quyết vấn đề - hy vọng điều này sẽ giúp:

:%s/\r/\r/g

Điều đó thật thú vị bởi vì tôi thay thế các ngắt dòng bằng cùng một ký tự, nhưng tôi cho rằng Vim chỉ cần có một \ r mới để hiển thị chính xác. Tôi muốn biết các cơ chế cơ bản về lý do tại sao điều này hoạt động.


1
Có xu hướng các chức năng tìm kiếm chấp nhận các quy tắc rộng hơn để nhận ra các chuỗi cuối dòng. Nhưng \ r có một ý nghĩa cụ thể khi nó được viết dưới dạng dữ liệu.
gbarry

Điều này làm việc cho tôi trong Windows gVim để sắp xếp một tệp không bị ngắt dòng, thay vào đó chỉ có rất nhiều ^ M.
flash

2
Từ tất cả các giải pháp được cung cấp trên trang này, đây là mẫu duy nhất phù hợp với tôi trong việc xóa ^ M khỏi tệp csv. Sử dụng MacVim.
B6431

+1 Tôi cũng làm việc với tôi trong khi SSH tới Ubuntu Trusty từ Windows bằng Mobaterm
Carl

Vì vậy, điều này dường như thay thế tất cả các \rnhân vật \nmặc dù chỉ định \rlà người thay thế. Không phàn nàn, đó chính xác là những gì tôi muốn. Thật kỳ lạ.
bánh rán

34

Đầu tiên, sử dụng :set ff?để tìm ra định dạng tệp mà tệp của bạn là.

Tôi đoán có thể là vậy unix, vấn đề là tệp của bạn đã được tạo bằng fileformat=doscách thêm "^ M ^ J" vào đầu dòng nhưng chỉ đọc bằng flieformat=unixcách xóa "^ J" khỏi đầu dòng, để lại "^ M" ở đó.

Chỉ cần nhập vào :e ++ff=dosdòng lệnh Vim để thay đổi định dạng tệp của bạn từ unix sang dos. Nó sẽ giải quyết vấn đề. Nếu không, :%s/\r//gnên giúp bạn ra ngoài.


3
Tôi đã phải làm cả hai. :e ++ff=dossau đó :set ff=unix:w
Tối đa

29

để có được ký tự ^ M khớp với tôi, tôi phải chọn nó một cách trực quan và sau đó sử dụng lệnh sao chép hệ điều hành vào bảng tạm để truy xuất nó. Bạn có thể kiểm tra nó bằng cách tìm kiếm ký tự trước khi thử lệnh thay thế.

/^M

nên chọn dòng xấu đầu tiên

:%s/^M/\r/g

sẽ thay thế tất cả các sai lầm ^ M bằng trả lại vận chuyển.

Đây là chức năng trong MacVim, dựa trên gvim 7.

BIÊN TẬP:

Gặp vấn đề này một lần nữa trên máy Windows 10 của tôi, có Ubuntu cho Windows và tôi nghĩ rằng điều này gây ra sự cố tệp định dạng cho vim. Trong trường hợp này, việc thay đổi ff thành unix, mac hoặc dos không làm gì khác hơn là thay đổi ^ M thành ^ J và quay lại.

Giải pháp trong trường hợp này:

:%s/\r$/ /g
:%s/ $//g

Lý do tôi đi theo con đường này là vì tôi muốn đảm bảo rằng tôi không bị phá hủy với tập tin của mình. Tôi có thể có :%s/\r$//gnhưng điều đó sẽ xóa ngay việc trả lại xe ngựa và có thể có kết quả bất ngờ. Thay vào đó, chúng tôi chuyển đổi ký tự CR số ít, ở đây một ký tự ^ M, thành một khoảng trắng, sau đó xóa tất cả các khoảng trắng ở cuối dòng (đối với tôi là kết quả mong muốn bất kể)

Xin lỗi vì đã làm sống lại một câu hỏi cũ đã được trả lời từ lâu, nhưng dường như có một số nhầm lẫn đang diễn ra và tôi nghĩ rằng tôi sẽ giúp xóa một số câu hỏi đó vì điều này đang tăng cao trong các tìm kiếm google.


1
nhấn ctrl-v ctrl-m cũng có thể hoạt động để chèn ký tự, fwiw. nhưng \ r là những gì chèn trở lại vận chuyển thích hợp.
Nhà siêu âm

1
Đây là câu trả lời đúng. Như đã nói ở trên, sử dụng <ctrl-v> <ctrl-m> để lấy chữ ^ M được chèn trong lệnh.
carlosayam

1
Tôi đồng ý, mặc dù tôi chắc chắn rằng nếu điều đó đã làm việc cho tôi tại thời điểm đăng bài gốc thì tôi sẽ không đăng. ;)
Nhà siêu âm

22

Không ai trong số này làm việc cho tôi, vì vậy tôi đã thử cách này, nó hoạt động:

kiểu :%s/

nhấn CTRL-VCTRL-M

kiểu //g

nhấn Enter

Vì vậy, lệnh tổng thể trong Vim shoud trông giống như :%s/^M//g

Điều này làm gì: :%s(tìm và thay thế) /^M/(biểu tượng đó) /(không có ký tự) g(trên toàn cầu).


Đập vào!! Hoạt động trên Mac.
shamail


15

Không cần sử dụng Ctrl: :%s/\r$//


1
Đây là cách tôi làm nó là tốt. Tôi chỉ không bao giờ nhớ lệnh
pixel 67

Đây là cách được đề nghị để loại bỏ những kết thúc này.
Nhà siêu âm


12

Tôi đã làm điều này với sed:

sed -i -e 's/\r/\n/g' filename


Bạn có chắc chắn điều này hoạt động? Trên OSX: sed -e 's/\r/\n/g' <<< 'over and over'->oven and oven
Armand

Có nó hoạt động (tôi sử dụng nó rất nhiều), nhưng trên OSX nếu bạn chưa cài đặt phiên bản GNU của sed thì nó có thể không hoạt động. Phiên bản sed mà Apple gửi theo mặc định khác nhiều (đáng buồn thay) so với phiên bản GNU được phát hành trên tất cả các bản phân phối Linux. Kiểm tra câu trả lời cho câu hỏi này để được trợ giúp thêm: stackoverflow.com/q/30003570/2062384
Freedom_Ben

Cảm ơn @Freedom_Ben. Vì vậy, nó có vẻ như điều này hoạt động cho GNU sednhưng không phải BSD sedsau đó (như được tìm thấy trên OSX). Bất cứ ai sửa lỗi ngắt dòng có thể đang làm việc với một hỗn hợp các hệ điều hành, vì vậy thật hữu ích khi biết câu trả lời sẽ hoạt động khi nào.
Armand

10

Điều gì về chỉ: :%s/\r//g Điều đó hoàn toàn làm việc cho tôi.

Những gì nó làm chỉ là để làm sạch cuối dòng của tất cả các dòng, nó loại bỏ ^ M và đó là nó.


9

Có nhiều câu trả lời khác cho câu hỏi này, tuy nhiên, những điều sau đây phù hợp nhất với tôi, vì tôi cần một giải pháp dòng lệnh:

vim -u NONE -c 'e ++ff=dos' -c 'w ++ff=unix' -c q myfile

Giải trình:

  • Không tải bất kỳ tệp .vimrc nào, hãy mở myfile
  • Chạy :e ++ff=dos để buộc tải lại toàn bộ tệp dưới dạng kết thúc dòng dos.
  • Chạy :w ++ff=unixđể ghi tệp bằng cách sử dụng kết thúc dòng unix
  • Thoát vim

3
cảm ơn bạn! điều này đã khắc phục sự cố của tôi và thấy nó hữu ích khi sử dụng trong các tập lệnh
Peddipaga

8

Ctrl+ Mthu nhỏ cửa sổ của tôi, nhưng Ctrl+ Enterthực sự chèn một ^Mký tự. Tôi cũng phải chắc chắn không nhấcCtrl phím giữa các lần nhấn.

Vì vậy, giải pháp cho tôi là:

:%s/<Ctrl-V><Ctrl-Enter>/\r/g

Nơi <Ctrl-V><Ctrl-Enter>có nghĩa là nhấn và giữ Ctrl , nhấn và phát hành V, nhấn và phát hành Enter, sau đó phát hành Ctrl .

Nếu bạn đang làm việc trên một tệp do Windows tạo

Giải pháp trên sẽ thêm một dòng bổ sung giữa các dòng hiện có, bởi vì đã có một vô hình \rsau ^M.

Để ngăn chặn điều này, bạn muốn xóa các ^Mký tự mà không thay thế chúng.

:%s/<Ctrl-V><Ctrl-Enter>//g

Trong đó %có nghĩa là "trong bộ đệm này" scó nghĩa là "thay thế", /có nghĩa là "(tìm) mẫu sau", <Ctrl-V><Ctrl-Enter>đề cập đến các phím cần nhấn để lấy ^Mký tự (xem ở trên), //có nghĩa là "không có gì" (hoặc, "với mẫu giữa hai dấu gạch chéo, trống ") và gcờ có nghĩa là" toàn cầu ", trái ngược với lần xuất hiện đầu tiên trong một dòng.


7

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

  1. Đặt định dạng tệp thành unix ( \nkết thúc dòng)
  2. lưu các tập tin

Vì vậy, trong vim:

:set ff=unix
:w

1
Điều này làm việc cho tôi, trong khi câu trả lời được chấp nhận thì không.
Marcello Romani

7

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,

5

Ngoài ra, có các tiện ích nguồn mở được gọi là dos2unix và unix2dos có sẵn để thực hiện điều này. Trên một hệ thống linux, chúng có thể được cài đặt theo mặc định; đối với hệ thống cửa sổ, bạn có thể tải xuống từ http://www.bastet.com/ trong số những người khác.


5
sed s/^M//g file1.txt > file2.txt

Trong đó ^ M được gõ bằng cách nhấn đồng thời 3 phím, ctrl + v + m


4

sử dụng tiện ích dos2unix nếu tệp được tạo trên windows, sử dụng tiện ích mac2unix nếu tệp được tạo trên mac. :)


chưa bao giờ nghe nói về mac2unix trước đây, sẽ có upvote một lần nữa nếu tôi có thể!
Kuf

Nhanh lên Đây là con đường để đi!
Riêng tư



1

Để lưu tổ hợp phím , bạn có thể tránh nhập Ctrl+ VCtrl+ Mbằng cách đặt phím này trong ánh xạ. Chỉ cần mở một tệp chứa ký tự ^ M, kéo nó và dán nó vào một dòng như thế này trong .vimrc của bạn:

nnoremap <Leader>d :%s/^M//g<CR>

1

Không ai trong số những đề xuất này hoạt động đối với tôi khi đã xoay sở để có được một loạt các ^Mngắt dòng trong khi làm việc với cả vim và nhật thực. Tôi nghi ngờ rằng tôi đã gặp phải một trường hợp bên ngoài nhưng trong trường hợp nó giúp bất cứ ai tôi đã làm.

:%s/.$//g

Và nó đã giải quyết vấn đề của tôi


Điều này sẽ loại bỏ BẤT K character ký tự nào ở cuối dòng. Nếu bạn có một dòng không, vì một số lý do, bị chấm dứt bởi ^ M, thì bạn cũng sẽ xóa ký tự đó và sẽ bất ngờ. Đây không phải là trường hợp, nhưng trong trường hợp là như vậy, và bạn không biết điều này, thì bạn có thể hờn dỗi tập tin của bạn một cách rất khó để xác định.
Nhà siêu âm

1
:g/^M/s// /g

Nếu bạn gõ ^Mbằng cách sử dụng Shift+6 Caps+Mnó sẽ không chấp nhận.

Bạn cần gõ ctrl+v ctrl+m.


1

^Mcho ngắt dòng không mong muốn. Để xử lý điều này, chúng ta có thể sử dụng sedlệnh như sau:

sed 's/\r//g'

idk tại sao điều này đã được hạ xuống -1 ... bởi vì nó sử dụng sed? bạn có thể thực hiện thay thế tương tự bên trong vim và nó sẽ hoạt động
Siêu hình học

1

Chỉ cần xóa set binarytrong .vimrc của bạn!


Trong một luồng khác, "set binary" được khuyến nghị để loại bỏ tự động chèn dòng mới.
dexter2305

1

Để sử dụng sedtrên MacOS, hãy làm điều này:

sed -i.bak $'s/\r//' <filename>

Giải thích: Các $'STRING'cú pháp ở đây gắn liền với bash shell. Máy Mac không được coi \rlà nhân vật đặc biệt. Bằng cách trích dẫn chuỗi lệnh trong $''bạn đang nói shell thay thế \rbằng \rký tự thực tế được chỉ định trong tiêu chuẩn ANSI-C.


0

"Hàm này bảo tồn danh sách các bước nhảy

fun! Dos2unixFunction()
let _s=@/
let l = line(".")
let c = col(".")
try
    set ff=unix
    w!
    "%s/\%x0d$//e
catch /E32:/
    echo "Sorry, the file is not saved."
endtry
let @/=_s
call cursor(l, c)
endfun
com! Dos2Unix keepjumps call Dos2unixFunction()

Trong trường hợp này, có gì sai khi sử dụng lệnh dos2unix riêng của * NIX? linux.die.net/man/1/dos2unix
Siêu hình học

0

Tôi đã trải qua một buổi chiều vật lộn với \ n ctrl-v 012 (cả hai đều cung cấp cho tôi null). & lao động qua chủ đề này cho đến khi tôi đạt đến nhà siêu hình.

\r làm việc tốt cho tôi

/),/s/),/)\r/g

biến một cái gì đó như thế này:

danh sách đen thêm: i386 (0.4.1, 0.4.1 + nmu1), libmount1: i386 (2.20.1-5.1, 2.20.1 -5.2), libblkid1: i386 (2.20.1-5.1, 2.20.1-5.2) , libapt-pkg4.12: i386 (0.9.7.4, 0.9.7.5), nmap: i386 (6,00-0,1, 6,00-0,2), libsane-common: i386 (1.0.22-7.3,

vào một cái gì đó như thế này:

26 libwv-1.2-4: i386 (1.2.9-3, tự động)
27 openjdk-6-jre-headless: i386 (6b24-1.11.4-3, tự động)
28 jed: i386 (0.99.19-2.1)

Ma thuật. Tôi vô cùng biết ơn

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.