Wyjście polecenia „tree” z „czystym” (7-bitem) wyjściem ASCII

44

Polecenie „drzewo” używa ładnych znaków rysujących ramkę, aby pokazać drzewo, ale chcę użyć danych wyjściowych w kontekście „neutralnym dla strony kodowej” (wiem, że tak naprawdę zawsze jest strona kodowa, ale ograniczając ją do niższej postacie Mam nadzieję, że będę wolny od zmartwień, że ktoś w Ułan Bator zobaczy buźki itp.).

Na przykład zamiast:

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

Chciałbym coś takiego:

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

ale żadna z kombinacji przełączników „drzewiastych”, które próbowałem, nie dała tego (wydaje się bardziej, jakby przyjmowały znaki rysowania ramek jako linię podstawową i czyniły ją jeszcze ładniejszą)

Szukałem również filtrów rysujących ramki, aby wykonywać takie konwersje bez znajdowania niczego poza nieskończoną ilością dzieł ASCII :-). Ogólny filtr pachnie czymś, co należy ugotować w 15 minut - plus dwa kolejne kolejne dni, wpadając do wszystkich zabawnych narożnych skrzynek :-)

Tom Goodfellow
źródło
Dzięki za pytanie. Potrzebowałem tego, aby móc przesłać dane wyjściowe drzewa do enscript, aby uzyskać kontrolę nad formatowaniem wydruku (używając dprint / dprintm z mojego pakietu duplexpr sourceforge.net/projects/duplexpr/. )
Joe

Odpowiedzi:

59

Nie jestem tego pewien, ale myślę, że wszystko czego potrzebujesz to

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

Na przykład:

$ 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

Alternatywnie możesz użyć --charsetopcji:

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

2 directories, 3 files
terdon
źródło
Nie ma GNU tree, nie ma Uniksa tree, nie ma POSIX tree. Jedyną treeimplementacją, o której wiem, jest mama.indstate.edu/users/ice/tree .
Stéphane Chazelas
3
@StephaneChazelas dzięki, więc --charsetopcja powinna być zawsze dostępna. Odpowiedź edytowana.
terdon
Wspaniały! (szczególnie wersja sed - dla mnie sed to dzikie krainy poza granicą awk)
Tom Goodfellow
1
Podoba mi się opcja drzewa --charset = ascii, dzięki
ling
4
Właściwie uważam, że --charsetnajpierw należy wspomnieć o tej opcji - alternatywne użycie sedjest pouczające, ale bardziej skomplikowane ...
rob74
30

Co 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

źródło
2
To to samo, cotree --charset nwildner
Stéphane Chazelas
Tak. Druga odpowiedź została zredagowana, więc nie zauważyłem, że @terdon udzielił pełniejszej odpowiedzi, pisząc moją;)