Chuyển đổi kết thúc dòng DOS thành kết thúc dòng Linux trong vim


717

Nếu tôi mở các tệp tôi đã tạo trong Windows, tất cả các dòng kết thúc bằng ^M.
Làm cách nào để xóa tất cả các ký tự này cùng một lúc?


Nếu bạn làm một hexdump -C badfilevà thấy 0x0d 0x0a "\r\n"đó là vấn đề của bạn.
Yzmir Ramirez

Câu trả lời:


1075

dos2unix là một tiện ích dòng lệnh sẽ làm điều này hoặc :%s/^M//gsẽ nếu bạn sử dụng Ctrl- v Ctrl- mđể nhập ^ M, hoặc bạn có thể:set ff=unix và vim sẽ làm điều đó cho bạn.

Tài liệu về cài đặt 'fileformat' ở đây và wiki vim có một trang toàn diện về chuyển đổi kết thúc dòng .

Thay vào đó, nếu bạn di chuyển các tệp qua lại nhiều, bạn có thể không muốn chuyển đổi chúng, nhưng thay vào đó :set ff=dos, vim sẽ biết đó là tệp DOS và sử dụng các quy ước của DOS cho các kết thúc dòng.


56
:%s/^M//gnên :%s/\r//g, bởi vì ^Mchỉ có nghĩa là "khớp vốn" M "ở đầu dòng".
Bunyk

78
Không, nếu bạn làm như câu trả lời và 'sử dụng ctrl-v ctrl-m để nhập ^ M'.
pjz

2
crtl-v là không tốt, trên windows nó dán nội dung clipboard vào dòng lệnh. Giải pháp :%s/\r//ghiệu quả với tôi, chúc mừng @Bunyk
roblogic

3
@ropata Những gì bạn muốn trên Windows là ctrl-q .
ruffin

2
Tôi phải thiếu một cái gì đó, bởi vì set ff=unixkhông làm gì cả. Có thể nó chuyển đổi tập tin, nhưng tất cả các ^Mnhân vật vẫn còn đó.
felwithe 30/03/2017

276

Thay đổi kết thúc dòng trong chế độ xem:

:e ++ff=dos
:e ++ff=mac
:e ++ff=unix

Điều này cũng có thể được sử dụng như lưu hoạt động (: w một mình sẽ không lưu bằng cách sử dụng các kết thúc dòng bạn thấy trên màn hình):

:w ++ff=dos
:w ++ff=mac
:w ++ff=unix

Và bạn có thể sử dụng nó từ dòng lệnh:

for file in *.cpp
do 
    vi +':w ++ff=unix' +':q' "$file"
done

4
Cảm ơn rât nhiều. Tôi đã thử vi + ': wq ++ ff = unix' <filepath> cho một người lười biếng như tôi.
a_secenthusiast

2
Đây phải là câu trả lời được đánh giá cao nhất. :w +ff=unixđẹp hơn rất nhiều so với hầu hết những thứ khác được viết ở đây, và kịch bản bash là một phần thưởng tuyệt vời.
mkasberg

Các :elệnh không xuất hiện để làm bất cứ điều gì trên cài đặt Windows vim của tôi. Quan điểm của tôi vẫn hiển thị các ^Mmã.
Grant Birchmeier

160

Tôi thường sử dụng

:%s/\r/\r/g

có vẻ hơi kỳ quặc, nhưng hoạt động vì cách mà vim khớp với các nguồn cấp dữ liệu. Tôi cũng thấy dễ nhớ hơn :)


9
Điều này hoạt động nhất quán trên các nền tảng. Câu trả lời tốt nhất ở đây.
thebigjc

4
Tôi chưa bao giờ có bất kỳ vấn đề nào :set ff=unixtrước đây, nhưng tập tin tôi mở hôm nay chắc chắn rất kỳ lạ. Vim nói rằng nó đã được fileformat=unixnhưng tất cả các kết thúc dòng là ^M. Giải pháp này đã làm việc cho tôi.
Chris B

15
Giải pháp này thêm các dòng bổ sung không mong muốn cho tôi, nhân đôi số dòng trong tệp. :%s/\r//gthay vì làm việc cho tôi
Victor Zamanian

3
Victor, các tệp của bạn có thể có kết thúc \ r \ n. \ r không được đọc dưới dạng dòng mới nhưng \ n là. Trong các tệp tôi đang chạy là \ r và bạn phải thêm một ký tự dòng mới.
Joeyjoejoejr

2
@ VictorZamanian :%s/\r//glà giải pháp đa năng duy nhất - đặc biệt là đối với các tệp ở chế độ hỗn hợp có chứa một hỗn hợp không đồng nhất của cả hai dòng mới theo kiểu DOS và UNIX. Các giải pháp kinh điển (ví dụ :set ff=unix, :e ++ff=unix) giả định tất cả các dòng của bộ đệm đầu hiện nay theo phong cách xuống dòng tương tự. Đôi khi họ làm; đôi khi họ không. Cue mặt buồn.
Cecil Curry

97

Tôi thích sử dụng lệnh sau:

:set fileformat=unix

Bạn cũng có thể sử dụng machoặcdos chuyển đổi tương ứng tệp của mình sang quy ước tệp macffy hoặc MS-DOS / MS-Windows. Và nó không làm gì nếu tập tin đã ở đúng định dạng.

Để biết thêm thông tin, hãy xem trợ giúp vim:

:help fileformat

1
Lệnh này dường như không làm bất cứ điều gì trên Windows vim của tôi. Quan điểm của tôi vẫn còn ^Mký tự trong đó.
Grant Birchmeier

Thêm set fileformat=unixvào tập tin .vimrc của tôi đã làm việc.
Joey Allen

20

:set fileformat=unix để chuyển đổi từ dos sang unix.


1
Điều này thực sự giải quyết vấn đề cho tôi. Tôi không thể tìm thấy những nhân vật đó trong khi tìm kiếm.
Thuyền trưởng Insaneo

20
:%s/\r+//g

Trong Vim, dải đó trả lại tất cả vận chuyển và chỉ để lại dòng mới.


2
Vì một số lý do trên đã không làm việc cho tôi dưới windows gvim. Nhưng khi thay đổi :%s/\r//gnó hoạt động như một lá bùa.
soltysh

1
@soltysh:% s / \ r \ + $ // g
thinker3


10

Chuyển đổi thư mục của các tập tin từ dos sang Unix

Sử dụng dòng lệnh và sed, tìm tất cả các tệp trong thư mục hiện tại có phần mở rộng ".ext" và xóa tất cả "^ M"

@ https://gist.github.com/sparkida/7773170

find $(pwd) -type f -name "*.ext" | while read file; do sed -e 's/^M//g' -i "$file"; done;

đồng thời, như đã đề cập ở trên ^ M = Ctrl+V+ Ctrl+M(không chỉ nhập ký hiệu "^" dấu mũ và M)


9

dos2unix có thể trực tiếp sửa đổi nội dung tập tin.

Bạn có thể trực tiếp sử dụng nó trên tệp mà không cần chuyển hướng tệp tạm thời.

dos2unix input.txt input.txt

Ở trên sử dụng bàn phím giả định của Hoa Kỳ. Sử dụng -tùy chọn 437 để sử dụng bàn phím Vương quốc Anh.

dos2unix -437 input.txt input.txt



6

Với lệnh sau:

:%s/^M$//g 

Lấy ^Mkiểu xuất hiện CtrlVrồi CtrlM. CtrlVnói với Vim để đưa nhân vật tiếp theo nhập theo nghĩa đen.


6

Nhận xét về việc ^ M xuất hiện là những gì làm việc cho tôi. Chỉ cần gõ "^ M" trong vi của tôi không có gì (không tìm thấy). Các CTRL+ V CTRL+ Mchuỗi đã làm nó một cách hoàn hảo mặc dù.

Lệnh thay thế làm việc của tôi là

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

và nó trông như thế này trên màn hình của tôi:

:%s/^M/\r/g

4
Bạn có thể sử dụng :%sthay vì :1,$s. %là tốc ký cho 1,$.
Tin Man

5

Tôi tìm thấy một cách rất dễ dàng: Mở tệp bằng nano: nano file.txt

Nhấn CTRL+ Ođể lưu, nhưng trước khi nhấn Enter, hãy nhấn: ALT+ Dđể chuyển đổi các kết thúc dòng của DOS và Unix / Linux, hoặc: ALT+ Mđể chuyển đổi các kết thúc dòng Mac và Unix / Linux sau đó nhấn Enterđể lưu và CTRL+ Xđể thoát.


thực hiện điều này trên một máy chủ linux, tập tin có ^Mkết thúc. lưu dưới dạng dos để giữ, lưu dưới dạng linux để loại bỏ. có thể kiểm tra bằng cách sử dụngcat -v
HattrickNZ

Câu hỏi này là về vim, không phải nano.
Grant Birchmeier

5
:g/Ctrl-v Ctrl-m/s///

CtrlMlà ký tự \r, hoặc trả về vận chuyển, mà kết thúc dòng DOS thêm vào. CtrlVnói với vim để chèn một ký CtrlMtự bằng chữ vào dòng lệnh.

Nhìn chung, lệnh này thay thế tất cả \rbằng không có gì, loại bỏ chúng khỏi cuối dòng.


4

Bạn có thể dùng:

vim somefile.txt +"%s/\r/\r/g" +wq

hoặc dos2unix utility.


3

Bạn có thể sử dụng lệnh sau:
:%s/^V^M//g
trong đó '^' có nghĩa là sử dụng CTRLkhóa.


2

Lệnh bên dưới được sử dụng để định dạng lại tất cả tệp .sh trong thư mục hiện tại, tôi đã thử nó trên hệ điều hành Fedora của tôi.

for file in *.sh; do awk '{ sub("\r$", ""); print }' $file >luxubutmp; cp -f luxubutmp $file; rm -f luxubutmp ;done

2

Trong vim, gõ:

:w !dos2unix %

Điều này sẽ chuyển nội dung của bộ đệm hiện tại của bạn sang lệnh dos2unix và viết kết quả lên nội dung hiện tại. Vim sẽ yêu cầu tải lại tập tin sau


2

Để chạy trực tiếp vào bảng điều khiển linux: vim file.txt +"set ff=unix" +wq


1

Thường có một dos2unix lệnh bạn có thể sử dụng cho việc này, chỉ cần đảm bảo rằng bạn đọc hướng dẫn vì các phiên bản GNU và BSD khác nhau về cách chúng xử lý các đối số.

Phiên bản BSD:

dos2unix $FILENAME $FILENAME_OUT
mv $FILENAME_OUT $FILENAME

Phiên bản GNU:

dos2unix $FILENAME

Ngoài ra, bạn có thể tự tạo dos2unixvới bất kỳ câu trả lời được đề xuất nào ở đây, ví dụ:

function dos2unix(){
    [ "${!}" ] && [ -f "{$1}" ] || return 1;

    { echo ':set ff=unix';
      echo ':wq';
    } | vim "${1}";
}

1

Tôi biết tôi đã thấy điều này ở đâu đó. Đây là mẹo đăng nhập FreeBSD:

Cần xóa tất cả những ký tự ^ M khỏi tệp DOS? Thử

tr -d \\r < dosfile > newfile
    -- Originally by Dru <genesis@istar.ca>

0

Mặc dù chủ đề này rất cũ, tôi muốn đặt một thứ khác từ wikia:

%s/\r\+$//g

mà điền tìm thấy tất cả các dấu hiệu trở lại vận chuyển (một và nhiều đại diện) cho đến cuối dòng và xóa, vì vậy \nsẽ chỉ ở lại eol.


0

Đây là cách của tôi Tôi đã mở một tệp trong dos EOL và khi tôi lưu tệp sẽ tự động chuyển đổi thành unix EOL

autocmd BufWrite * :set ff=unix

0

nếu bạn tạo một tệp trong NotePad hoặc NotePad ++ trong windows và mang nó đến Linux và mở nó bằng vim, bạn sẽ thấy ^ M ở cuối mỗi dòng. Để loại bỏ điều này,

Tại thiết bị đầu cuối Linux của bạn, nhập

tên tệp dos2unix.ext

Điều này sẽ làm phép thuật cần thiết.


0

Tôi muốn dòng mới thay cho ^ M's. Perl để giải cứu:

perl -pi.bak -e 's/\x0d/\n/g' excel_created.txt

Hoặc để viết lên thiết bị xuất chuẩn:

perl -p -e 's/\x0d/\n/g' < excel_created.txt
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.