2

さて、これは簡単なものですが、私には理解できません。

<a href="[^<>]*">[^<>]*</a>基本的に、大きなhtmlファイルからすべてのリンク()を抽出したいと思います。

でこれを実行しようとしましたがsed、希望する結果ではなく、あらゆる種類の結果が得られます。ファイル内のすべてのリンクを置き換えることができるので、正規表現が正しいことを知っています。

sed 's_<a href="[^<>]*">[^<>]*</a>_TEST_g'

私がそれを次のようなもので実行すると

<div><a href="http://wwww.google.com">A google link</a></div>
<div><a href="http://wwww.google.com">A google link</a></div>

私は得る

<div>TEST</div>
<div>TEST</div>

他のすべてを取り除き、代わりに一致を印刷するにはどうすればよいですか?私の好ましい最終結果は次のようになります。

<a href="http://wwww.google.com">A google link</a>
<a href="http://wwww.google.com">A google link</a>

PS。私の正規表現は最も柔軟なものではないことを知っていますが、それは私の意図には十分です。

4

4 に答える 4

3

行全体を一致させ、興味深い部分をグループに入れ、グループの内容に置き換えます。オプションを使用して一致しない行を抑制し、修飾子を-n追加してコマンドの結果を出力します。ps

sed -n -e 's!^.*\(<[Aa] [^<>]*>.*</[Aa]>\).*$!\1!p'

行に複数のリンクがある場合、これは最後のリンクのみを出力することに注意してください。それを改善することはできますが、単純な sed の使用法を超えています。最も簡単な方法は、2 つのステップを使用することです。まず、2 つのリンクの前に改行を挿入し、次にリンクを抽出します。

sed -n -e 's!</a>!&\n!p' | sed -n -e 's!^.*\(<[Aa] [^<>]*>.*</[Aa]>\).*$!\1!p'

<pre>これはまだ、HTML コメント、複数行にわたるリンクなどを処理しません。HTMLを解析するときは、HTML パーサーを使用してください。

于 2012-08-25T23:49:27.047 に答える
1

sed のような perl を使用してもかまわない場合は、非常に多様な入力でコピーできます。

  perl -n -e 's+(<a href=.*?</a>)+ print $1, "\n" +eg;'
于 2012-08-25T23:56:23.430 に答える
1

行ごとにハイパーリンクが 1 つしかないと仮定すると、次のように動作する可能性があります...

  sed -e 's_.*<a href=_<a href=_' -e 's_>.*_>ed <<'EOF'
 -e 's_.*<a href=_<a href=_' -e 's_>.*_>_'
于 2012-08-25T23:42:42.913 に答える
0

これはうまくいくかもしれません(GNU sed):

sed '/<a href\>/!d;s//\n&/;s/[^\n]*\n//;:a;$!{/>/!{N;ba}};y/\n/ /;s//&\n/;P;D' file
于 2012-08-26T07:24:28.263 に答える