¿Cómo uso vim dentro de una tubería de Unix?
Puedo usar vim / ex para grep de un archivo usando la siguiente invocación:
ex -c'g/foo/p' -cq -s afile.txt
Realmente me gustaría usar un comando similar para grep de texto de stdin. Pensé que el siguiente comando debería funcionar, pero no produce ningún resultado:
cat afile.txt | ex -c'g/foo/p' -cq -s -
Lo mismo sucede si uso en vim -e
lugar de ex
:
cat test.md | vim -e -c'g/foo/p' -cq -s -
¿Hay alguna forma de que pueda forzar a ex a leer su búfer inicial desde stdin e imprimir la salida a stdout, de modo que pueda usarse dentro de una tubería Unix?
Respuestas
Mueva el nombre de archivo especial -
antes -e
:
cat test.md | vim -e -c'g/foo/p' -cq -s -
^
✘
cat test.md | vim - -e -c'g/foo/p' -cq -s
^
✔
Antes -e
, -
se lee como texto literal. Después -e
, -
se lee como un comando Ex.
Para suprimir la Vim: Reading from stdin...
advertencia, pase el --not-a-term
argumento al vim(1)
comando:
cat test.md | vim - -e -c'g/foo/p' -cq -s --not-a-term
^----------^
Para hacer que Vim se cierre, ejecute en :qa!
lugar de solo :q
:
cat test.md | vim - -e -c'g/foo/p' +'qa!' -s --not-a-term
^-^
Puede unirse a -e
y -s
, y puede reemplazarlo -c
con +
:
cat test.md | vim - -es +'g/foo/p' +'qa!' --not-a-term
^ ^
Ahora debería poder pasar la salida de Vim a otra utilidad de shell; por ejemplo wc(1)
:
cat test.md | vim - -es +'g/foo/p' +'qa!' --not-a-term | wc -l
^-----^
Ver también:
- vims
- Vim para filtrado de tuberías
- La vida social de Vim
- mis notas