Bạn cũng có thể làm điều này với một Ex
lệnh sử dụng sed
như một bộ lọc bên ngoài:
:%!sed -n 'h;n;G;h;n;G;h;n;G;p'
Phiên bản này sẽ bỏ qua (xóa) bất kỳ dòng bổ sung nào ngoài bội số 4. Để giữ bộ cuối cùng dưới 4 dòng (đảo ngược), sử dụng:
:%!sed -n '$p;h;n;G;$p;h;n;G;$p;h;n;G;p'
Ở %
đây có nghĩa là "Mỗi dòng trong bộ đệm."
Các !
phương tiện lệnh "Chạy lệnh sau đây với các dòng quy định như đầu vào, và thay thế các dòng chỉ định với đầu ra của lệnh." (Nó được gọi là bộ lọc; rất tiện cho những việc như sắp xếp, ví dụ: :%!sort
sẽ sắp xếp tất cả các dòng trong tệp của bạn; :2,8!sort
sẽ sắp xếp các dòng 2-8, v.v.)
sed
là công cụ chỉnh sửa luồng và được tìm thấy trên tất cả các hệ thống giống Unix. Các khái niệm chính sed
được sử dụng ở đây là "không gian mẫu" (theo mặc định chỉ lần lượt chứa từng dòng đầu vào) và "giữ không gian" (là nơi bạn có thể dán thêm văn bản trong khi sử dụng sed
để lưu nó trong khi xử lý khác dòng đầu vào).
-n
là một tùy chọn cho sed
lệnh để loại bỏ các hành động mặc định của nó là in không gian mẫu (vì trong trường hợp này chúng tôi chỉ muốn in khi chúng tôi nói rõ ràng như vậy.)
$p
trong sed
lệnh có nghĩa là "Nếu bạn đang ở dòng cuối cùng của sed
đầu vào, hãy in (không gian mẫu)."
h
có nghĩa là "dán nội dung hiện tại của 'không gian mẫu' vào 'không gian giữ', ghi đè lên bất cứ thứ gì ở đó."
n
có nghĩa là "thay thế nội dung của 'không gian mẫu' bằng dòng tiếp theo từ đầu vào."
G
có nghĩa là "nối vào 'không gian mẫu': một dòng mới theo sau là nội dung của 'không gian giữ'."
Kết hợp tất cả lại với nhau, sed
lệnh lưu trữ bốn dòng đầu ra, đảo ngược chúng khi nó lưu trữ chúng, và sau đó in chúng. Các $p
lệnh được thêm vào trong phiên bản thứ hai đảm bảo rằng nếu đạt đến dòng cuối cùng của tệp khác với nhiều dòng 4 thì các dòng vẫn được in.
Đối với phương pháp tương tác thay thế, vẫn không sử dụng bất kỳ tính năng cụ thể nào của Vim và cũng không sử dụng bộ lọc bên ngoài:
:4
để đi đến dòng thứ tư.
:.m -4 | +3m . | +2m . | +5
để đảo ngược bốn dòng trước (1-4) và để con trỏ của bạn trên dòng 8.
.m -4
di chuyển dòng hiện tại đến ngay sau dòng bốn dòng trở lại (để lại con trỏ trên dòng di chuyển).
+3m .
di chuyển dòng có 3 dòng sau dòng hiện tại, ngay sau dòng hiện tại, để con trỏ trên dòng di chuyển. +2m .
Tất nhiên hoạt động như nhau.
+5
đặt con trỏ năm dòng xuống từ vị trí của nó.
Lặp lại như mong muốn.
Trong Vim bạn có thể lặp lại toàn bộ lệnh này với @:
, sau đó lặp lại lần nữa với @@
. Trong POSIX vi
hoặc ex
bạn sẽ cần chèn :.m -4 | +3m . | +2m . | +5
dưới dạng một dòng văn bản, xóa nó vào một bộ đệm có tên (thanh ghi), và sau đó thực hiện bộ đệm có tên (thanh ghi) đó.
Vì vậy, trong ex
chế độ, chỉ đảo ngược các dòng tương tác chỉ sử dụng các tính năng do POSIX chỉ định và bắt đầu bằng 17 dòng văn bản:
Entering Ex mode. Type "visual" to go to Normal mode.
:0a # Append following text after "line 0" (i.e. insert at start of file).
.m -4 | +3m . | +2m . | +5
. # End text insertion
:d k # Delete that line to register k
line1 # This is a printout of the current line
:4 # Move to line 4
line4
:@k # Execute register k to reverse lines 1-4
line8
:@@ # Execute register k again
line12
:@@ # Execute register k again
line16
:@@ # Execute register k again
line17
:%p # Print the whole buffer (just to see what was done)
line4
line3
line2
line1
line8
line7
line6
line5
line12
line11
line10
line9
line16
line15
line14
line13
line17
:wq # Save and quit
Đọc thêm: