/abc/xyz が与えられると、sed を使用して /abc/xyz、/abc、/xyz を返します。

/abc/xyz が与えられると、sed を使用して /abc/xyz、/abc、/xyz を返します。

可能ですか?多くのURLと相対パスを含むHTMLファイルがあります。全部集めたいです。正規表現を使用すると、HTMLを正しく解析できないことがわかりましたが、どのタイプのデータを見ているかに関係ないソリューションを探しています。/[A-Za-z0-9_-]*複数のディレクトリ深度を含むすべてのパスのみを抽出する必要があります。

/this/is/a/testが与えられたら、私は次のものを得るべきです:

/this
/is
/a
/test
/this/is
/this/is/a
/this/is/a/test
/is/a
/a/test
/is/a/test

それがダインだと思います。これに対する解決策を書くことができれば確信しています!

ベストアンサー1

$ sed -n -f script.sed file
/this/is/a/test
/this/is/a
/this/is
/this
/is/a/test
/is/a
/is
/a/test
/a
/test

script.sedどこ

:outer
h
:inner
/./ {
    p
    s:/[^/]\{1,\}$::
    t inner
}
g
s:^/[^/]\{1,\}::
t outer

file前述のパス名のファイルが含まれています。

このスクリプトは、各入力行を処理する二重ループを実装します。パス名のある行を取得すると予想されます。ただ

外部ループ(表示outer)は、現在の行を予約済みスペース(h)にコピーします。行が空の場合は内部ループ(で示されているinner)を完全にスキップし、行が空でない場合は現在の行を印刷します。次に、現在の行から最後の行を削除し、/<anything>代替項目によってデータが変更された場合は、t inner内部ループの先頭に戻ります。

それ以外の場合は、保存された行が予約済みスペース()から取得され、最初のg行が削除されます。/<anything>交換によってデータが変更されると、コードは外部ループの先頭にループバックされます。

最終結果は、フルパス名を印刷してから最後の連続パスコンポーネントを削除して、生成された各パス名を取得することです。

次に、元のパス名から最初のパス要素を削除して得られたパス名についても同じ操作を繰り返します。など。

コード内の2つの代替項目を置き換えると同じ結果が得られますが、順序は異なります。

/this/is/a/test
/is/a/test
/a/test
/test
/this/is/a
/is/a
/a
/this/is
/is
/this

おすすめ記事