Come si usa vim all'interno di una pipe-line Unix?
Posso usare vim / ex per grep un file usando la seguente invocazione:
ex -c'g/foo/p' -cq -s afile.txt
Mi piacerebbe davvero usare un comando simile per grep del testo da stdin. Ho pensato che il seguente comando dovrebbe funzionare, ma non produce alcun output:
cat afile.txt | ex -c'g/foo/p' -cq -s -
La stessa cosa accade se utilizzo al vim -e
posto di ex
:
cat test.md | vim -e -c'g/foo/p' -cq -s -
C'è un modo per forzare ex a leggere il suo buffer iniziale da stdin e stampare l'output su stdout, in modo che possa essere utilizzato all'interno di una pipe-line Unix?
Risposte
Sposta il nome del file speciale -
prima di -e
:
cat test.md | vim -e -c'g/foo/p' -cq -s -
^
✘
cat test.md | vim - -e -c'g/foo/p' -cq -s
^
✔
Prima -e
, -
viene letto come testo letterale. Dopo -e
, -
viene letto come un comando Ex.
Per sopprimere l' Vim: Reading from stdin...
avviso, passare l' --not-a-term
argomento al vim(1)
comando:
cat test.md | vim - -e -c'g/foo/p' -cq -s --not-a-term
^----------^
Per far uscire Vim, esegui :qa!
invece di solo :q
:
cat test.md | vim - -e -c'g/foo/p' +'qa!' -s --not-a-term
^-^
Puoi unirti a -e
e -s
, e puoi sostituire -c
con +
:
cat test.md | vim - -es +'g/foo/p' +'qa!' --not-a-term
^ ^
Ora dovresti essere in grado di passare l'output di Vim a un'altra utility della shell; ad esempio wc(1)
:
cat test.md | vim - -es +'g/foo/p' +'qa!' --not-a-term | wc -l
^-----^
Guarda anche:
- vims
- Vim per il filtraggio delle condutture
- La vita sociale di Vim
- I miei appunti