2013-12-05 3 views
-1

Можно ли разделить STDIN (или STDOUT) так, чтобы следующая программа в конвейере могла интерпретировать поток как несколько файлов?Возможно ли разбиение на страницы STDOUT?

В частности, я хотел бы разделить git log -p выход на отдельные фиксации в пейджере less, как если бы я начал это с несколькими файлами и может :n через фиксации, так это понятнее, где кончается одно и начинается другие.

+0

В чем проблема с клавишей пробела? Разве это не проще, чем ': n'? – devnull

+0

Да, пробел/PgDn прокручиваются вниз, но легко выйти за пределы текущей фиксации или пропустить ее; Для ясности я хочу «более трудную» остановку между фиксациями. В настоящее время я ищу «^ commit», чтобы сделать его лучше. – Steve

ответ

1

Не уверен, что можно фактически разделить stdout.

Однако один из способов достижения желаемого результата состоит в том, чтобы разделить файл вывода git log -p на некоторый узор (скажем commit), а затем сформировать набор файлов, представляющих каждую фиксацию. Эти файлы можно просматривать в порядке. Вы будете нуждаться в команде csplit сделать расщепление:

csplit -zqf "commit-" <(git log -p) '/^commit /' '{*}' && less commit-* 

Это пытается разделить вывод команды мерзавца на регулярных выражениях шаблона произвольного число раз - следовательно, {*} - и для каждого матча помещает результат в файл. Полученные файлы - если они есть - имеют форму commit-n и создаются в текущем каталоге. Затем их можно просмотреть в порядке less от самого нового до самого старого.

Чтобы полностью понять параметры csplit, поиск man csplit.

+0

Спасибо, Герман. Я действительно обнаружил csplit сразу после того, как задал вопрос. Разделение STDOUT с помощью sed для ввода какого-то элемента управления было моей первой идеей, но похоже, что это невозможно. – Steve

+1

Регулярное выражение также может быть '/^.\[33mcommit /' при использовании опции '--color' для git, и цвета ANSI будут сохранены. – Steve

Смежные вопросы