Как использовать vim в конвейере Unix?

Aug 20 2020

Я могу использовать 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?

Ответы

4 user938271 Aug 21 2020 at 02:34

Переместите специальное имя файла -перед -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 для конвейерной фильтрации
  • Социальная жизнь Вима
  • мои заметки