純粋な sed の使用:
#!/bin/sed -f
x
G
: loop
s:\([^/]*\)/*\(.*\n\)\([^|]*\)|\s:\2\3\1/:
t loop
s/.*\n//
s:/*$::
h
このためには、ホールド スペース (補助バッファー) を使用して、以前のディレクトリ パスを格納する必要があります。次に、ホールド スペースからディレクトリを削除し、それらをそれぞれの | に置き換えることができます。より詳細な説明は次のとおりです。
このスクリプトは、すべての行に対して実行されます。まず、ホールド スペースとパターン スペースを交換 ("x") します。最初は、ホールド スペースは空ですが、最初の行の後、ホールド スペースには以前のディレクトリ パスが含まれます。それらを交換することにより、以前のディレクトリをロードし、現在の新しいディレクトリをホールド スペースに保存します。
次に、新しいディレクトリ名を以前のディレクトリ パスに追加します (ただし、どちらも改行で区切られます)。これに使用されるコマンドは「G」です。
| ごとにループする必要があります。私たちが見つけたキャラクター。これを行うのはトリッキーな部分なので、我慢してください。現在のパターン空間に次のものがあるとします
Folder/subdir
| | deeper-subdir
- まず、 は最初のスラッシュの前のすべてに一致し、それをキャプチャします (つまり、最初のキャプチャ グループであるため
\([^/]*\)
名前が付けられた「変数」に格納します)。\1
- 次に、スラッシュをスキップします:
/*
- 改行まで (含む) すべてをキャプチャし、 capture に格納します
\2
。\(.*\n\)
- 最初の前のすべてをキャプチャ | キャラクターとキャプチャーに保存
\3
:
\([^|]*\)
- | をスキップ 文字の後にスペース文字:
|\s
これで、キャプチャは次のようになります。
- フォルダ
- サブディレクトリ\n
3.
キャプチャを並べ替えて別のスラッシュを追加する行を再生成するだけで、次のようになります。
subdir
Folder/| deeper-subdir
その後、前の「s」コマンドが成功した場合にのみ「ループ」ラベルに戻る条件付き分岐コマンド「t」があります。つまり、文字列の準備ができたら (| がなくなると)、ループを終了してコードを続行できます。
例に従って、次の反復にはキャプチャが含まれます。
- サブディレクトリ
- \n
- フォルダ/
ループの後、最初の代替コマンドは、新しいディレクトリが入力されていないパスを含む最初の行を削除します (つまり、新しいディレクトリは前のディレクトリよりも「浅い」です)。
最後の代替コマンドは、行末からスラッシュをすべて削除し、最後のコマンドはホールド コマンド ("h") で、現在生成されているパスをホールド スペースにコピーするため、次の行ですべてを繰り返すことができます。
これが役立つことを願っています=)