Bagaimana cara menggunakan vim dalam pipa Unix?

Aug 20 2020

Saya dapat menggunakan vim / ex untuk grep file menggunakan doa berikut:

ex -c'g/foo/p' -cq -s afile.txt

Saya sangat ingin menggunakan perintah serupa untuk grep beberapa teks dari stdin. Saya pikir perintah berikut harus berfungsi, tetapi tidak menghasilkan output:

cat afile.txt | ex -c'g/foo/p' -cq -s -

Hal yang sama terjadi jika saya menggunakan vim -ealih-alih ex:

cat test.md | vim -e -c'g/foo/p' -cq -s -

Apakah ada cara agar saya dapat memaksa ex untuk membaca buffer awal dari stdin dan mencetak keluaran ke stdout, sehingga dapat digunakan dalam pipa saluran Unix?

Jawaban

4 user938271 Aug 21 2020 at 02:34

Pindahkan nama file khusus -sebelumnya -e:

cat test.md | vim -e -c'g/foo/p' -cq -s -
                                        ^
                                        ✘

cat test.md | vim - -e -c'g/foo/p' -cq -s
                  ^
                  ✔

Sebelumnya -e, -dibaca sebagai teks literal. Setelah -e, -dibaca sebagai perintah Ex.


Untuk menekan Vim: Reading from stdin...peringatan, teruskan --not-a-termargumen ke vim(1)perintah:

cat test.md | vim - -e -c'g/foo/p' -cq -s --not-a-term
                                          ^----------^

Untuk membuat Vim berhenti, jalankan :qa!alih-alih hanya :q:

cat test.md | vim - -e -c'g/foo/p' +'qa!' -s --not-a-term
                                     ^-^

Anda dapat bergabung -edan -s, dan Anda dapat mengganti -cdengan +:

cat test.md | vim - -es +'g/foo/p' +'qa!' --not-a-term
                      ^ ^

Sekarang Anda seharusnya bisa meneruskan keluaran Vim ke utilitas shell lain; misal wc(1):

cat test.md | vim - -es +'g/foo/p' +'qa!' --not-a-term | wc -l
                                                       ^-----^

Lihat juga:

  • vims
  • Vim untuk pemfilteran pipa
  • Kehidupan sosial Vim
  • catatan Saya