Làm thế nào để chia một dòng thành nhiều dòng hiệu quả?


11

Tôi đã nhận được dữ liệu đã ghi trong tệp văn bản chỉ là một dòng dài với mỗi giá trị được phân tách bằng khoảng trắng. Có một lệnh hoặc tập hợp các lệnh sẽ chia một dòng thành nhiều dòng?

Câu trả lời:


20

Bạn chỉ có thể thay thế bất kỳ khoảng trắng liên tiếp nào trên dòng bằng một dòng mới bằng cách sử dụng lệnh :s/\s\+/\r/g. \s\+có nghĩa là một hoặc nhiều ký tự khoảng trắng và \rlà một dòng mới, xem :help :substitute:help regexpđể biết chi tiết. Nếu bạn chạy lệnh trên một dòng như:

foo bar baz

Bạn lấy:

foo
bar
baz

Nếu bạn đã hlsearchbật và bạn không muốn làm lộn xộn màn hình của mình với các khoảng trắng được tô sáng ở mọi nơi, bạn có thể viết một chức năng nhỏ như sau để tránh điều đó:

function! SplitLineNicely()
    " Save previous value of last search register
    let saved_last_search_pattern = @/

    " :substitute replaces the content of the search register with the `\s\+` 
    " pattern highlighting all whitespaces in the file
    substitute /\s\+/\r/g

    " Restore previous search register
    let @/ = saved_last_search_pattern
endfunction

"Nếu bạn không muốn làm lộn xộn màn hình của mình với các không gian được tô sáng ở mọi nơi" thì điều này giả định quá nhiều về thiết lập của OP.
romainl

@romainl Tốt hơn?
toro2k

1
Vâng, đó là IMO tốt hơn.
romainl

2
Đó là \r, xem :help s/\r. Nó có thể được thay thế bằng một cách gõ dòng chữ mới <c-v><cr>. Trong bối cảnh \nnày là một nhân vật null, xem :help s/\n.
toro2k

1
replaces the content of the register- đăng ký nào?
stillanoob

5

Sử dụng vimthay thế có lẽ là một trong những cách tốt hơn để hoàn thành nhiệm vụ của bạn, nhưng bạn cũng có thể sử dụng macro. Giả sử chúng ta có dữ liệu sau, với con trỏ ở đâu đó trên dòng 1:

1 a b c d e f
~

Bắt đầu ở chế độ bình thường, nhấn qqsẽ bắt đầu ghi macro có thể gọi qua @q. Bất cứ điều gì gõ sau qqsẽ được lặp lại thông qua cuộc gọi nói trên. Mục tiêu của chúng tôi là ghi lại các lệnh thông thường sẽ đủ chung để cho phép lặp lại liền mạch.

Do đó, chúng ta có thể gõ 0để đưa con trỏ đến đầu dòng, sau đó fspacedi chuyển con trỏ đến khoảng trắng đầu tiên. Điều này cho phép chúng ta sau đó gõ renter, dẫn đến:

1 a
2 b c d e f
~

Đánh qngay bây giờ là một ý tưởng tốt vì macro có thể tái sử dụng của chúng tôi đã sẵn sàng để lặp lại. Một cách tùy tiện, chúng tôi lưu ý rằng có 4 khoảng trống còn lại để thay thế bằng dòng mới. Do đó, bằng cách nhấn, 4@qchúng tôi lặp lại qmacro 4 lần dẫn đến:

1 a
2 b
3 c
4 d
5 e
6 f
~

Lưu ý rằng do cách chúng tôi thiết lập macro, nên sẽ lặp lại lệnh trên 9000 lần một cách an toàn, vì nó sẽ chỉ ảnh hưởng đến dòng hiện tại và vì không có khoảng trắng ở bên phải của mục nhập dữ liệu cuối cùng, fspacesẽ 'độc đáo' thất bại, ngăn dữ liệu được thay thế bằng dòng mới.

Vì vậy, để lặp lại từ đầu:

qq0fspacerenterq9001@q

cung cấp kết quả của chúng tôi.


1
Tôi thích rằng bạn có một 9001phím trên bàn phím để nhập tên người dùng nhanh.
Giàu

4

Cách dễ nhất mà tôi đã tìm thấy để phân chia các dòng trong Vim là lệnh chế độ bình thường gq(nhập cả hai chữ cái liên tiếp trong chế độ bình thường hoặc trực quan).

Trong chế độ trực quan, nó sẽ phân chia bất cứ thứ gì được chọn, ở chế độ bình thường, bạn làm theo gqchuyển động.

Ví dụ: gqlsẽ chia một dòng thành chiều rộng hiện được đặt. Để đặt độ rộng của các dòng chia khác với cài đặt hiện tại của bạn, bạn có thể sử dụng :set textwidth=n, nsố lượng ký tự bạn muốn trong một dòng, ví dụ, 10và thay đổi trở lại chiều rộng thông thường của bạn khi bạn hoàn thành.

Nhận thông tin này từ một video Youtube của Kholidfu cho thấy cách nối và chia dòng ở chế độ bình thường bằng chuyển động.

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.