ฉันจะใช้ vim ภายในท่อ Unix ได้อย่างไร

Aug 20 2020

ฉันสามารถใช้ vim / ex เพื่อ grep ไฟล์โดยใช้คำเรียกร้องต่อไปนี้:

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

ฉันต้องการใช้คำสั่งที่คล้ายกันเพื่อ grep บางข้อความจาก stdin ฉันคิดว่าคำสั่งต่อไปนี้ควรใช้งานได้ แต่ไม่มีผลลัพธ์:

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

สิ่งเดียวกันนี้จะเกิดขึ้นถ้าฉันใช้vim -eแทนex:

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

มีวิธีใดบ้างที่ฉันสามารถบังคับให้ ex อ่านบัฟเฟอร์เริ่มต้นจาก stdin และพิมพ์เอาต์พุตไปยัง stdout เพื่อให้สามารถใช้ภายในท่อ Unix ได้

คำตอบ

4 user938271 Aug 21 2020 at 02:34

ย้ายชื่อไฟล์พิเศษ-ก่อนหน้านี้-e:

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

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

ก่อน-e, -จะอ่านเป็นข้อความตัวอักษร หลังจาก-e, -จะอ่านเป็นคำสั่งที่ไม่ได้รับสิทธิ


ในการระงับVim: Reading from stdin...คำเตือนให้ส่ง--not-a-termอาร์กิวเมนต์ไปที่vim(1)คำสั่ง:

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

ในการทำให้ Vim ออกจากระบบให้ดำเนินการ:qa!แทนแค่:q:

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

คุณสามารถเข้าร่วม-eและ-sและคุณสามารถแทนที่-cด้วย+:

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

ตอนนี้คุณควรจะสามารถส่งเอาต์พุตของ Vim ไปยังยูทิลิตี้เชลล์อื่นได้แล้ว เช่นwc(1):

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

ดูสิ่งนี้ด้วย:

  • เป็นกลุ่ม
  • เป็นกลุ่มสำหรับการกรองไปป์ไลน์
  • ชีวิตทางสังคมของ Vim
  • บันทึกของฉัน