Làm thế nào để ghi toàn bộ bộ đệm vào đầu ra tiêu chuẩn từ dòng lệnh?


10

Tôi muốn ghi toàn bộ bộ đệm vào đầu ra tiêu chuẩn ( /dev/stdout) thay vì tệp và lệnh sau hoạt động như mong đợi trong khi chỉnh sửa tệp:

:w >> /dev/stdout

Gợi ý: Nhấn Control+ Lđể làm mới màn hình.

Nhưng nó không hoạt động như mong đợi khi tôi đang cố gắng làm tương tự từ dòng lệnh ( không tương tác ), ví dụ:

$ echo This is example. | vim - '+:w >> /dev/stdout' '+:q!'
Vim: Reading from stdin...

Cùng với :w !tee, :x! /dev/stdout, :%printvà tương tự.

Trước khi bỏ, nó nói : [Device] 1L, 17C appended.

Có cách nào buộc vim viết đầu vào tiêu chuẩn thành đầu ra tiêu chuẩn ở giữa một đường ống không? Có lẽ nó bằng cách nào đó được đệm?


4
Chỉ tò mò, bạn đang cố gắng để đạt được điều gì? Như trong, vim sẽ làm gì cho bạn ở đây mà một số công cụ khác có thể không?
Jay Thompson

1
@JayThndry Tôi đang cố gắng sử dụng vimđể phân tích cú pháp tệp thay vì sed(ví dụ: các thay đổi phức tạp lặp đi lặp lại thành nhiều tệp lớn). Ví dụ này không làm gì để giữ cho nó đơn giản và không tạo ra sự trùng lặp tiềm năng của một bài đăng khác .
kenorb 14/2/2015

Bạn biết về vipe, vậy lý do nào bạn không sử dụng nó?
muru 14/2/2015

@muru Tôi chưa sử dụng nó, chưa có nhiều tài liệu và nó không có chủ đề ở đây.
kenorb 14/2/2015

Các câu hỏi về vipe có thể là, nhưng không có lý do gì nó không thể là câu trả lời. Vì vậy, tôi tự hỏi tại sao tôi không nên đăng nó như một câu trả lời.
muru

Câu trả lời:


9

Để in bộ đệm sang đầu ra tiêu chuẩn shell, vimcần bắt đầu ở chế độ Ex, nếu không, nó sẽ mở cách "bình thường" với cửa sổ riêng và xóa bất kỳ bộ đệm đầu ra nào khi thoát.

Dưới đây là ví dụ làm việc đơn giản nhất:

$ echo foo | vim -e '+%print' '+q!' /dev/stdin
foo

hoặc thậm chí ngắn hơn:

$ echo foo | ex +%p -cq! /dev/stdin
$ echo foo | ex +"%p|q!" /dev/stdin

Lưu ý: Lệnh vim -evề cơ bản tương đương với exlệnh.

Bộ mô tả tệp đặc biệt cho đầu vào tiêu chuẩn cần được chỉ định ( /dev/stdin) để ngăn các thông báo gây phiền nhiễu thêm (như được giải thích bên dưới).


Và đây là một số ví dụ với các chuỗi phân tích cú pháp:

$ echo This is example. | vim -e '+s/example/test/g' '+%print' '+q!' /dev/stdin
This is test.
$ echo This is example. | vim - -es '+s/example/test/g' '+%print' '+q!'
Vim: Reading from stdin...
This is test.

Lưu ý: Ví dụ cuối cùng cho thấy thông báo gây khó chịu thêm mà không thể ẩn nó, đó là vì một chiến lược tiêu chuẩn là đọc toàn bộ tệp vào bộ nhớ và nói rằng nó đã được đọc từ đầu vào tiêu chuẩn. Ví dụ đầu tiên hoạt động mà không có thông báo, vì tệp tạo ra dữ liệu vô tận mà không có tín hiệu cuối tệp ( EOF ), do đó, nó sẽ không bao giờ đạt đến cuối đọc đầu vào.


Liên quan:


1
Bạn chỉ có thể làm +q!chứ không phải +:q!, phải không?
Andrew

@AndrewMacFie Đó là điều tương tự, được cập nhật, cảm ơn.
kenorb

3

vipelà một công cụ thuận tiện để chỉnh sửa các đường ống, một phần của moreutilsgói. Nó là một trình bao bọc cho các biên tập viên (bao gồm cả vicái tên của nó). Nó sử dụng các EDITORbiến môi trường để thiết lập các biên tập viên, như vậy, như với các công cụ khác mà làm cho sử dụng EDITOR(ví dụ như crontab, visudo, vv), bạn có thể hành động kịch bản sử dụng biến đó. Ví dụ: bạn có thể thay đổi nó để làm:

$ echo foo | EDITOR='vim +:s/foo/bar/ +wq' vipe | tail
bar

Tất nhiên, các hành động phức tạp có thể chuyển sang trích dẫn địa ngục, vì vậy bạn có thể viết một kịch bản:

#! /bin/sh

vim "+:s/foo/bar" '+wq' "$@"

Và sử dụng EDITOR="sh /path/to/script".

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.