ฉันจะใช้ vim ภายในท่อ Unix ได้อย่างไร
ฉันสามารถใช้ 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 ได้
คำตอบ
ย้ายชื่อไฟล์พิเศษ-
ก่อนหน้านี้-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
- บันทึกของฉัน