Comment utiliser vim dans un pipeline Unix?

Aug 20 2020

Je peux utiliser vim / ex pour grep un fichier en utilisant l'invocation suivante:

ex -c'g/foo/p' -cq -s afile.txt

J'aimerais vraiment utiliser une commande similaire pour grep du texte de stdin. Je pensais que la commande suivante devrait fonctionner, mais elle ne produit aucune sortie:

cat afile.txt | ex -c'g/foo/p' -cq -s -

La même chose se produit si j'utilise à la vim -eplace de ex:

cat test.md | vim -e -c'g/foo/p' -cq -s -

Existe-t-il un moyen de forcer ex à lire son tampon initial à partir de stdin et à imprimer la sortie vers stdout, de sorte qu'il puisse être utilisé dans un pipeline Unix?

Réponses

4 user938271 Aug 21 2020 at 02:34

Déplacez le nom de fichier spécial -avant -e:

cat test.md | vim -e -c'g/foo/p' -cq -s -
                                        ^
                                        ✘

cat test.md | vim - -e -c'g/foo/p' -cq -s
                  ^
                  ✔

Avant -e, -est lu comme un texte littéral. Après -e, -est lu comme une commande Ex.


Pour supprimer l' Vim: Reading from stdin...avertissement, transmettez l' --not-a-termargument à la vim(1)commande:

cat test.md | vim - -e -c'g/foo/p' -cq -s --not-a-term
                                          ^----------^

Pour que Vim quitte, exécutez :qa!au lieu de simplement :q:

cat test.md | vim - -e -c'g/foo/p' +'qa!' -s --not-a-term
                                     ^-^

Vous pouvez rejoindre -eet -s, et vous pouvez remplacer -cpar +:

cat test.md | vim - -es +'g/foo/p' +'qa!' --not-a-term
                      ^ ^

Vous devriez maintenant pouvoir passer la sortie de Vim à un autre utilitaire shell; par exemple wc(1):

cat test.md | vim - -es +'g/foo/p' +'qa!' --not-a-term | wc -l
                                                       ^-----^

Voir également:

  • vims
  • Vim pour le filtrage des pipelines
  • La vie sociale de Vim
  • mes notes