Как использовать vim в конвейере Unix?
Я могу использовать vim / ex для grep файла, используя следующий вызов:
ex -c'g/foo/p' -cq -s afile.txt
Я бы очень хотел использовать аналогичную команду для поиска текста из stdin. Я думал, что следующая команда должна работать, но она не выводит:
cat afile.txt | ex -c'g/foo/p' -cq -s -
То же самое произойдет, если я использую vim -e
вместо ex
:
cat test.md | vim -e -c'g/foo/p' -cq -s -
Есть ли способ заставить ex читать свой начальный буфер из stdin и выводить вывод на stdout, чтобы его можно было использовать в конвейере Unix?
Ответы
Переместите специальное имя файла -
перед -e
:
cat test.md | vim -e -c'g/foo/p' -cq -s -
^
✘
cat test.md | vim - -e -c'g/foo/p' -cq -s
^
✔
Перед тем -e
, -
читается как обычный текст. После того, как -e
, -
читается как команда Ex.
Чтобы подавить Vim: Reading from stdin...
предупреждение, передайте --not-a-term
аргумент vim(1)
команде:
cat test.md | vim - -e -c'g/foo/p' -cq -s --not-a-term
^----------^
Чтобы Vim закрылся, выполните :qa!
вместо простого :q
:
cat test.md | vim - -e -c'g/foo/p' +'qa!' -s --not-a-term
^-^
Вы можете присоединиться -e
и -s
, а можете заменить -c
на +
:
cat test.md | vim - -es +'g/foo/p' +'qa!' --not-a-term
^ ^
Теперь вы должны иметь возможность передавать вывод Vim в другую утилиту оболочки; например wc(1)
:
cat test.md | vim - -es +'g/foo/p' +'qa!' --not-a-term | wc -l
^-----^
Смотрите также:
- vims
- Vim для конвейерной фильтрации
- Социальная жизнь Вима
- мои заметки