¿Cómo uso vim dentro de una tubería de Unix?

Aug 20 2020

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 -elugar 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

4 user938271 Aug 21 2020 at 02:34

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-termargumento 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 -ey -s, y puede reemplazarlo -ccon +:

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