Vim - cách thay thế một dòng mới \ n bằng hai \ n


34

Trong trình chỉnh sửa vim, tôi muốn thay thế một ký tự dòng mới (\ n) bằng hai ký tự dòng mới (\ n \ n) bằng chế độ lệnh vim.

Nội dung tập tin đầu vào:

This is my first line.
This is second line.

Lệnh mà tôi đã thử:

:%s/\n/\n\n/g

nó thay thế chuỗi bằng các ký tự không mong muốn như

This is my first line.^@^@This is second line.^@^@

Sau đó, tôi đã thử lệnh sau

:%s/\n/\r\r/g

Nó đang hoạt động đúng. Bạn có thể giải thích tại sao nó hoạt động tốt với lệnh thứ hai?



2
FYI: Ngoài ra còn có Vi và Vim (beta) SE .
Dubu

2
Lưu ý bên, bạn không phải sử dụng /làm dấu phân cách. Điều này dễ đọc hơn::%s;\n;\n\n;g
DJMcMayhem

1
Tìm kiếm \n, thay thế bằng \r\r, :% s/\n/\r\r/g: stackoverflow.com/a/71334/911945
Anton Tarasenko

Câu trả lời:


47

Thật kỳ lạ, \ntrong vim để thay thế không có nghĩa là dòng mới, nhưng null. ASCII nul là ^@( control@).

Trong lịch sử, vi thay thế ^M( controlM) là dòng kết thúc, là dòng mới. vim đã thêm một phần mở rộng \r(như ngôn ngữ C) có nghĩa tương tự như ^M, nhưng các nhà phát triển đã chọn làm cho \nnull có nghĩa khi thay thế văn bản. Điều này không phù hợp với việc sử dụng nó trong các tìm kiếm , tìm thấy một dòng mới.

Đọc thêm:


7

Hãy thử điều này: %s/$/^V^M/(nơi ^VCtrl-V^MCtrl-M- khi bạn gõ ^Vnó sẽ in một ^char sau đó xóa lùi trên nó và sau đó khi bạn gõ ^Mnó sẽ xuất hiện như ^M... tổ hợp phím Ctrl-V là tiêu chuẩn tty đen tiếp theo nhân vật - chạy lệnh stty -ađể hiển thị ký tự đặc biệt của tty của bạn).


Thật vậy, những người rất có kinh nghiệm sẽ biết điều này đối với việc chuyển đổi từng được yêu cầu từ CRLF như là một cách thay thế cho việc bỏ học và sử dụng dos2unix hoặc tương tự. Việc sử dụng Ctrl-V là bài học 1 vi ngày.
mckenzm

5

vimsử dụng \nđể thể hiện một ký tự null \0trong bộ nhớ, cách vimxử lý tệp chứa ký tự null (trong khi vikhông thể).

Việc sử dụng \nchỉ khớp cuối dòng trong bộ đệm, không sử dụng dòng mới trong chuỗi khi sử dụng trong biểu thức.

Xem : h NL-used-for-Null: h CR-used-for-NL để biết thêm chi tiết.


1

Đã thử nghiệm với Neovim ( nvim) và Vimcác phiên bản

NVIM v0.3.0
VIM - Vi IMproved 8.1

Xóa một dòng mới:

cell
allele
rs2981578
fgfr2

Tại đây, \nkhớp với các dòng mới ( tuy nhiên để chèn một dòng mới, hãy sử dụng \r):

:'<,'>s/\n/|/g

cell|allele|rs2981578|fgfr2

Thêm một dòng mới:

Không

cell|allele|rs2981578|fgfr2

:'<,'>s/\n/|/g

cell^@allele^@rs2981578^@fgfr2

^@là một dấu phụ cho LF (nguồn cấp dữ liệu; xem http://vimhelp.appspot.com/dicles.txt.html#dicless-default )

Vâng:

cell|allele|rs2981578|fgfr2

:'<,'>s/|/\r/g

cell
allele
rs2981578
fgfr2

Để giải quyết câu hỏi của OP (cách thay thế một \nbằng hai, \n\n), chỉ cần thêm một câu hỏi khác \r:

cell
allele
rs2981578
fgfr2

:'<,'>s/\n/\r\r/g

cell

allele

rs2981578

fgfr2

... tức là khớp với dòng mới ban đầu ( \n) và thay thế nó bằng hai dòng mới / trả về vận chuyển ( \r\r).

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.