Come si usa vim all'interno di una pipe-line Unix?

Aug 20 2020

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

4 user938271 Aug 21 2020 at 02:34

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-termargomento 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 -ee -s, e puoi sostituire -ccon +:

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