各行の先頭のボックス描画文字とスペースが一致する数のスペースに置き換えられるように、$tree --noreport$の出力を操作したいと思います。この文字に一致するパターンを作成すると、sedがUnicodeエスケープシーケンスを認識しないため、文字列がラップされ^\\(\u2500\\|\u2514\\|\u251C\\| \\)*\u2500
ます。$'...'
このパターンは、tree --noreport
最初の行を除くすべての出力行に表示されます。一致するすべての文字列のすべての文字を空白に置き換える必要があります。
入力例:
.
├── docs
│ ├── jokes
│ │ └── knock_knock.txt
│ └── work
├── images
└── .profile
出力例:
.
docs
jokes
knock_knock.txt
work
images
.profile
これで、私の目的のためにファイルまたはフォルダ名が始まる場所を明確にする必要があることに気づきました(ファイルまたはフォルダ名は1つ以上のスペースで始まる可能性があります)。したがって、出力は実際には次のようになります。
.
/docs
/jokes/
/knock_knock.txt
/work
/images
/.profile
私が提供したパターンの終わりは、\u2500
実際にはツリー形式とファイル/フォルダ名の始まりを区別します。
ベストアンサー1
次のループで一度に1つずつ交換できます。
tree --noreport | sed $'
:1
s/^\\( *\\)\\([\ua0\u2500\u2502\u2514\u251C]\\)\\([\ua0\u2500\u2502\u2514\u251C ]*\u2500 \\)/\\1 \\3/
t1
s|\u2500 | /|'
(少なくとも私のバージョンの出力には\ua0
(単純な空白ではない)と\u2502
(あなたの例にも示されています)がありません。)│
tree
"─ "
名前の前にこれらの文字を含むファイルがある場合は、だまされています。
別の方法(実際に挿入したいと/
呼び出すディレクトリに対応するtree
エントリがないと仮定):最初のエントリの後に挿入し、ループ内"─ "
の最初の文字の前のすべての文字を空白に置き換えます。/
"\u2500 "
/
tree --noreport | sed '
s|'$'\u2500'' |&/|;t1
b
:1
s|^\( *\)[^ /]|\1 |
t1'
次のコマンドを使用する方が簡単ですperl
。
tree --noreport | perl -C -pe 's{^.*?\x{2500} }{" " x length($&) . "/"}e'