Nối các dòng giữa một mẫu văn bản nhất định trong Vim


8

Tôi có một tệp văn bản trông như thế này:

A.
text
text
text


A.
more text

more text

A.
more text

Tôi muốn nối tất cả các dòng giữa các "điểm đánh dấu" A.để nó trông giống như:

A.texttexttext
A.more textmore text
A.more text

Làm thế nào tôi có thể làm điều này trong Vim?

Câu trả lời:


4
:%s/\n\(\(A\.$\)\@!.*\)/\1/

Thay thế một mẫu phù hợp:

  1. dòng mới,
  2. một nhóm chứa

    1. không phải là chuỗi A.trực tiếp theo cuối dòng, sau đó
    2. bất kỳ ký tự nào cho đến hết dòng

với:

  • tất cả mọi thứ phù hợp ngoại trừ dòng mới bắt đầu (tức là nhóm ở trên),

và làm điều này trên toàn cầu.


1
Cảm ơn. Tôi không biết làm thế nào mà cái đó hoạt động, nhưng nó dường như! Tôi sẽ phải mổ xẻ nó một cách cẩn thận. Tôi cũng tìm thấy một công việc xung quanh bằng cách nối tất cả các dòng và sau đó chèn một dòng mới vào "A."
vim noob

@vimnoob: Xem :help \@!trong Vim để biết thêm thông tin về phần đó. Nếu không, nó thẳng tiến, hy vọng, với lời giải thích của tôi. Một vấn đề với cách tiếp cận của bạn là nếu " A." xảy ra trong văn bản, mặc dù không phải là một dòng đánh dấu bị cô lập, nó sẽ được phân tách như thể ban đầu nó là một điểm đánh dấu. Trong thực tế, nó có thể không phải là một vấn đề (tôi không biết tệp "thực" của bạn trông như thế nào), nhưng nói chung nó có thể gây ra hành vi không mong muốn nếu một người không biết về điều này.
Daniel Andersson

@vimnoob: Tôi đọc lại câu trả lời của mình và trong trường hợp bạn không quen với :%s///cú pháp: đó là cú pháp "tìm kiếm và thay thế" trong Vim. :bắt đầu lệnh, %chỉ định toàn bộ bộ đệm là phạm vi, sbắt đầu thay thế. /là dấu phân cách mẫu (bất kỳ ký tự nào khác có thể được sử dụng, nhưng /là "tiêu chuẩn"). Mẫu thứ nhất /bắt đầu mẫu tìm kiếm, mẫu thứ hai thay thế và mẫu thứ ba kết thúc mẫu tìm kiếm. Công cụ sửa đổi Trailing có sẵn để chỉ định độ nhạy cảm trường hợp, vv \1đại diện cho nhóm lấy trong mẫu tìm kiếm. :%s/foo/bar/thay thế foobằng bartrong tập tin.
Daniel Andersson

Cảm ơn sự giúp đỡ của bạn. Tôi chỉ cần nghiên cứu cái này \ @! một phần như tôi đã quen thuộc với thay thế tìm kiếm cơ bản và regrec cơ bản.
vim noob

1
@Reman: Cách đơn giản nhất mà tôi nghĩ ngay đến là chạy một trận đấu mô hình toàn cầu tiếp theo như thế nào :%s/^A\.//. Phương thức trong câu trả lời không tự chụp các ^A\.mẫu (thay vì sự vắng mặt của chúng), vì vậy nó không thể sửa đổi các chuỗi đó theo một cách rõ ràng.
Daniel Andersson

7

Điều này cũng hoạt động (khi dòng đầu tiên bắt đầu với A.)

:v/^A/-1j!

Đó là công việc! Đẹp. +1
ZaSter

Yay, thật ra, và hai mánh mới đối với tôi, sau trận đấu chống mẫu toàn cầu (v): 'j' để tham gia và '!' để tham gia mà không cần thêm một không gian. Cảm ơn bạn.
fortboise

@Miro wow! tôi chào bạn nếu bạn có thể giải thích lý do tại sao nó hoạt động thì siêu! .. tôi cũng phải nối các dòng có ký tự tab ở giữa ... vì vậy, những gì tôi đã làm là thêm ký tự / / / t trên lệnh .. bất kỳ cách nào tốt hơn
ihightower
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.