Comment utiliser vim dans un pipeline Unix?
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
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