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'?
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'?
Câu trả lời:
Đâ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
:e ++ff=dos
tiếp theo :set ff=unix
sẽ chuyển đổi các kết thúc thành một định dạng lành mạnh.
:%s/<Ctrl-V><Ctrl-M>/\r/g
Trong đó <Ctrl-V><Ctrl-M>
có nghĩa là loại Ctrl+ Vthì Ctrl+ M.
:%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).
:%s/<Ctrl-V><Ctrl-M>/\r/g
(trong đó \ r thay thế ^ M bằng một dòng mới).
Trên Linux và Mac OS, các công việc sau đây,
:%s/^V^M/^V^M/g
trong đó ^V^M
có nghĩa là loại Ctrl+ V, sau đó Ctrl+ M.
Lưu ý: trên Windows bạn có thể muốn sử dụng ^Q
thay vì ^V
, theo mặc định ^V
được ánh xạ để dán văn bản.
%s/\r/\r/g
hoạ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.
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).
set ff=unix
như một phím tắt nhỏ theo cách tương tự ft
là một phím tắt chofiletype
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 ^M
trả 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.
\r
nhân vật \n
mặc dù chỉ định \r
là 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ạ.
Đầ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=dos
cách thêm "^ M ^ J" vào đầu dòng nhưng chỉ đọc bằng flieformat=unix
cách xóa "^ J" khỏi đầu dòng, để lại "^ M" ở đó.
Chỉ cần nhập vào :e ++ff=dos
dò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//g
nên giúp bạn ra ngoài.
:e ++ff=dos
sau đó :set ff=unix
và:w
để 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$//g
như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.
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).
^ M được lấy bởi Ctrl+ Vvà M, do đó,
s/^M//g
Không cần sử dụng Ctrl:
:%s/\r$//
Điều đơn giản đã làm việc cho tôi
dos2unix filename
Tôi đã làm điều này với sed:
sed -i -e 's/\r/\n/g' filename
sed -e 's/\r/\n/g' <<< 'over and over'
->oven and oven
sed
nhưng không phải BSD sed
sau đó (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.
Đ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ó.
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:
myfile
: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.:w ++ff=unix
để ghi tệp bằng cách sử dụng kết thúc dòng unixCtrl+ Mthu nhỏ cửa sổ của tôi, nhưng Ctrl+ Enterthực sự chèn một ^M
ký 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 .
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 \r
sau ^M
.
Để ngăn chặn điều này, bạn muốn xóa các ^M
ký tự mà không thay thế chúng.
:%s/<Ctrl-V><Ctrl-Enter>//g
Trong đó %
có nghĩa là "trong bộ đệm này" s
có 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 ^M
ký 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à g
là cờ 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.
Điều này làm việc cho tôi:
\n
kết thúc dòng)Vì vậy, trong vim:
:set ff=unix
:w
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,
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.
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
Sử dụng một trong các lệnh sau:
:%s/\r//g
Hoặc là
:%s/\r\(\n\)/\1/g
Điều này làm việc cho tôi:
:% s/\r\n/\r
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 ^M
ngắ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
:g/^M/s// /g
Nếu bạn gõ ^M
bằng cách sử dụng Shift+6 Caps+M
nó sẽ không chấp nhận.
Bạn cần gõ ctrl+v ctrl+m
.
^M
cho ngắt dòng không mong muốn. Để xử lý điều này, chúng ta có thể sử dụng sed
lệnh như sau:
sed 's/\r//g'
Chỉ cần xóa set binary
trong .vimrc của bạn!
Để sử dụng sed
trê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 \r
là 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ế \r
bằng \r
ký tự thực tế được chỉ định trong tiêu chuẩn ANSI-C.
"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()
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