it-swarm-vi.tech

Cách thay thế một ký tự bằng một dòng mới trong Vim

Tôi đang cố gắng thay thế mỗi , trong tệp hiện tại bằng một dòng mới:

:%s/,/\n/g 

Nhưng nó chèn những gì trông giống như một ^@ thay vì một dòng mới thực sự. Các tập tin không ở chế độ DOS hoặc bất cứ điều gì.

Tôi nên làm gì?

Nếu bạn tò mò, như tôi, hãy kiểm tra câu hỏiTại sao\r là một dòng mới cho Vim?là tốt.

1755
Vinko Vrsalovic

Sử dụng \r thay vì \n.

Thay thế bởi \n chèn một ký tự null vào văn bản. Để nhận dòng mới, hãy sử dụng \r. Tuy nhiên, khi tìm kiếm cho một dòng mới, bạn vẫn sử dụng \n. Sự không đối xứng này là do thực tế là \n\rlàm những việc hơi khác nha :

\n khớp với một dòng cuối (dòng mới), trong khi \r phù hợp với lợi nhuận vận chuyển. Mặt khác, trong các thay thế \n chèn một ký tự null trong khi \r chèn một dòng mới (chính xác hơn, nó được coi là đầu vào <CR>). Ở đây, một ví dụ nhỏ, không tương tác để minh họa điều này, bằng cách sử dụng tính năng dòng lệnh Vim (nói cách khác, bạn có thể sao chép và dán đoạn sau vào một thiết bị đầu cuối để chạy nó). xxd hiển thị hexdump của tệp kết quả.

echo bar > test
(echo 'Before:'; xxd test) > output.txt
vim test '+s/b/\n/' '+s/a/\r/' +wq
(echo 'After:'; xxd test) >> output.txt
more output.txt
Before:
0000000: 6261 720a                                bar.
After:
0000000: 000a 720a                                ..r.

Nói cách khác, \n đã chèn byte 0x00 vào văn bản; \r đã chèn byte 0x0a.

2317
Konrad Rudolph

Đây là mẹo:

Đầu tiên, đặt phiên vi (m) của bạn để cho phép khớp mẫu với các ký tự đặc biệt (ví dụ: dòng mới). Có lẽ đáng để đặt dòng này trong tệp .vimrc hoặc .exrc của bạn.

:set magic

Tiếp theo, làm:

:s/,/,^M/g

Để lấy ký tự ^M, hãy nhập Control-v va đanh Enter. Trong Windows, làm Control-qEnter. Cách duy nhất tôi có thể nhớ những điều này là bằng cách nhớ chúng có ý nghĩa như thế nào:

A: Điều gì sẽ là nhân vật điều khiển tồi tệ nhất được sử dụng để đại diện cho một dòng mới?

B: Hoặc là q (vì nó thường có nghĩa là "Thoát") hoặc v vì nó rất dễ gõ Control-c do nhầm lẫn và giết trình soạn thảo.

A: Làm cho nó thành.

184
Logan

Trong cú pháp s/foo/bar\r\n có ý nghĩa khác nhau, tùy thuộc vào ngữ cảnh.


ngắn:

Dành cho fooname__:
[.__.]\n = dòng mới (LF trên linux/mac, CRLF trên windows)
[.__.]\r = trả lại xe (CR)

Dành cho barname__:
[.__.]\r = là dòng mới
[.__.]\n = null byte.

dài hơn: (với số ascii)

NUL= 0x00 = 0 = CTRL@
[.__.] LF= 0x0A = 10 = CTRLJ
[.__.] CR= 0x0D = 13 = CTRLM

Dưới đây là danh sách ký tự điều khiển ASCII , chèn chúng vào vimthông qua CTRLvCTRL---key---.
[.__.] Trong bashhoặc các shell unix/linux khác chỉ cần gõ CTRL---key---. Thử CTRLM trong bash, nó giống như đánh ENTER, khi Shell nhận ra ý nghĩa của nó, mặc dù các hệ thống linux sử dụng Nguồn cấp dữ liệu để phân định dòng.

Để chèn chữ theo nghĩa đen, hãy thêm chúng vào CTRLv cũng sẽ làm việc.

Hãy thử trong bash:

echo ^[[33;1mcolored.^[[0mnot colored.

Điều này sử dụng chuỗi thoát ANSI , chèn hai ^[ 's qua CTRLvESC.

Bạn cũng có thể thử CTRLvCTRLmENTER, sẽ cung cấp cho bạn điều này:

bash: $'\r': command not found

Ghi nhớ \r từ trên? :>

Danh sách này ký tự điều khiển ASCII khác với danh sách hoàn chỉnh bảng ký hiệu ASCII , trong đó các ký tự điều khiển, được chèn vào bảng điều khiển/pseudoterminal/vim thông qua CTRL chìa khóa (haha), có thể được tìm thấy ở đó. Trong khi đó bằng C và hầu hết các ngôn ngữ khác, bạn thường sử dụng mã bát phân để thể hiện các 'ký tự' này.

Nếu bạn thực sự muốn biết tất cả những thứ này đến từ đâu: http://www.linusakesson.net/programming/tty/ .
[.__.] Đây là liên kết tốt nhất bạn sẽ bắt gặp về chủ đề này, nhưng hãy cẩn thận: Có những con rồng.


TL; DR

Thông thường foo= \nbar= \r.

84
sjas

Bạn cần sử dụng

:%s/,/^M/g

Để lấy ký tự ^M, bấm Ctrlv theo dõi bởi Enter

50
dogbane

\r có thể làm việc ở đây cho bạn.

33
Lasar

Với Vim trên Windows sử dụng Ctrl+Q thay cho Ctrl+V

22
grantc

Đây là câu trả lời tốt nhất cho cách tôi nghĩ nhưng nó sẽ đẹp hơn trong một bảng: https://stackoverflow.com/a/12389839/962394 .

Vì vậy, viết lại:

Bạn cần sử dụng \r để sử dụng nguồn cấp dữ liệu dòng (ascii 0x0a, dòng mới unix) trong một thay thế regex nhưng đó là đặc thù của thay thế - thông thường bạn nên tiếp tục sử dụng \n cho nguồn cấp dữ liệu và \r để trả về vận chuyển.

Điều này là do vim đã sử dụng \n trong một thay thế có nghĩa là ký tự NIL (ascii 0x00). Thay vào đó, bạn có thể đã mong đợi NIL là \0, giải phóng \n để sử dụng thông thường cho nguồn cấp dữ liệu, nhưng \0 đã có ý nghĩa trong việc thay thế regex nên đã được chuyển sang \n. Do đó, sau đó sẽ đi xa hơn để chuyển dòng mới từ \n sang \r (trong mẫu regex là ký tự trả về vận chuyển, ascii 0x0d).

[.__.] ký tự | mã ascii | Đại diện C | trận đấu regex | thay thế regex [.__.] ------------------------- + ------------ + ---- -------------- + ------------- + --------------------- --- [.__.] Không | 0x00 |\0 |\0 |\n [.__.] nguồn cấp dữ liệu (unix newline) | 0x0a |\n |\n |\r [.__.] trở về xe ngựa | 0x0d |\r |\r | <không rõ> [.__.]

NB: ^M (Ctrl-V Ctrl-M trên linux) chèn một dòng mới khi được sử dụng trong thay thế regex thay vì trả lại vận chuyển như những người khác đã khuyên (tôi mới thử).

Cũng lưu ý rằng vim sẽ dịch ký tự nguồn cấp dữ liệu khi nó lưu vào tệp dựa trên cài đặt định dạng tệp của nó và điều đó có thể gây nhầm lẫn.

10
codeshot

Từ Eclipse, các ký tự ^M có thể được nhúng trong một dòng và bạn muốn chuyển đổi chúng thành dòng mới.

:s/\r/\r/g
10
rickfoosusa

Nhưng nếu người ta phải thay thế thì làm theo

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

ở trên, mỗi dòng tiếp theo được thay thế bằng dòng tiếp theo và sau đó | - và một dòng tiếp theo. Điều này được sử dụng trong các bảng wiki. nếu văn bản như sau:

line1
line2
line3

được đổi thành

line1
|-
line2
|-
line3
7
Kiran K Telukunta

Nếu bạn cần làm toàn bộ tập tin, tôi cũng có thể đề nghị với bạn rằng bạn có thể thử từ dòng lệnh

sed 's/\\n/\n/g' file > newfile
6
Evan Donovan

Đây là câu trả lời làm việc cho tôi. Từ anh chàng này

---- trích dẫn http://jaysonlorenzen.wordpress.com/2009/04/11/use-vi-editor-to-insert-newline-char-in-replace/


Một cái gì đó khác tôi phải làm và không thể nhớ và sau đó phải tìm kiếm.

Trong vi để chèn một ký tự dòng mới vào tìm kiếm và thay thế, hãy làm như sau:

:% s/look_for/thay_with ^ M/g lệnh ở trên sẽ thay thế tất cả các phiên bản của look look_for tựa bằng cách thay thế

để có được các ứng dụng khác, hãy nhập tổ hợp phím, phím ctl-V, sau đó (giải phóng tất cả các phím) nhấn phím Nhập enter.


4
user407749