Вывод команды «tree» с «чистым» (7-битным) выводом ASCII

44

Команда «tree» использует хорошие символы рисования прямоугольников, чтобы показать дерево, но я хочу использовать вывод в «нейтральном для кодовой страницы» контексте (я знаю, что на самом деле всегда есть кодовая страница, но ограничив ее нижним Я надеюсь, что персонажи не будут беспокоиться, что кто-то в Улан-Баторе увидит улыбающиеся лица и т. д.).

Например вместо:

├── include
│   ├── foo
│   └── bar

Я хотел бы что-то вроде:

+-- include
|   +-- foo
|   \-- bar

но ни одна из комбинаций переключателей «дерева», которые я пробовал, не дала этого (кажется, что они берут символы рисования прямоугольника в качестве базовой линии и делают его еще красивее)

Я также искал фильтры рисования прямоугольников для выполнения таких преобразований, не находя ничего, кроме бесконечного количества искусства ASCII :-). Универсальный фильтр пахнет чем-то, что нужно приготовить за 15 минут - плюс еще два дополнительных дня, натыкающихся на все забавные угловые случаи :-)

Том Гудфеллоу
источник
Спасибо за вопрос. Мне это нужно, чтобы я мог передать вывод дерева в enscript, чтобы получить контроль форматирования печати (используя dprint / dprintm из моего пакета duplexpr sourceforge.net/projects/duplexpr/. )
Джо

Ответы:

60

Я не уверен в этом, но я думаю, что все, что вам нужно, это

tree | sed 's/├/\+/g; s/─/-/g; s/└/\\/g'

Например:

$ tree
.
├── file0
└── foo
    ├── bar
    │   └── file2
    └── file1

2 directories, 3 files
$ tree | sed 's/├/\+/g; s/─/-/g; s/└/\\/g'
.
+-- file0
\-- foo
    +-- bar
    │   \-- file2
    \-- file1

2 directories, 3 files

В качестве альтернативы вы можете использовать --charsetопцию:

$ tree --charset=ascii
.
|-- file0
`-- foo
    |-- bar
    |   `-- file2
    `-- file1

2 directories, 3 files
Тердон
источник
Нет GNU tree, нет Unix tree, нет POSIX tree. Единственная известнаяtree мне реализация - mama.indstate.edu/users/ice/tree .
Стефан Шазелас
3
@StephaneChazelas спасибо, поэтому --charsetопция всегда должна быть доступна. Ответ отредактирован.
Terdon
Прекрасно! (особенно версия sed - для меня sed - это дикие земли за пределами границы awk)
Том Гудфеллоу
1
Мне нравится опция дерева --charset = ascii, спасибо
ling
4
На самом деле, я думаю, что --charsetвариант должен быть упомянут первым - альтернативное использование sedявляется поучительным, но более сложным ...
rob74
30

Как насчет tree --charset unicode?

|-- boot_print
|   |-- config-2.6.32-5-amd64
|   |-- grub
|   |   |-- 915resolution.mod
|   |   |-- acpi.mod
|   |   |-- affs.mod
|   |   |-- afs_be.mod
|   |   |-- afs.mod
|   |   |-- aout.mod
|   |   |-- ata.mod
|   |   |-- ata_pthru.mod
|   |   |-- at_keyboard.mod
|   |   |-- befs_be.mod
|   |   |-- befs.mod
|   |   |-- biosdisk.mod
|   |   |-- bitmap.mod
|   |   |-- bitmap_scale.mod
|   |   |-- blocklist.mod
|   |   |-- boot.img

источник
2
Это так же, какtree --charset nwildner
Стефан Шазелас
Ага. Другой ответ был отредактирован так, что я не заметил, что @terdon дал более полный ответ, пока я писал свой;)