/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

答え2

質問の本文は、2つの異なるものを要求するようです。これは、説明された正規表現に一致する相対URLパスのように見える入力ファイルから何かを抽出する最初の問題を解決します。

使用grep:

grep -Eio "(/[a-z0-9_-]+)+" file.html

関連情報