sed は 1 行に複数の一致を置き換えます。

sed は 1 行に複数の一致を置き換えます。

一部のHTMLリンクを置き換えて新しいタブで開くようにします(同じページへのリンクを除く)。

私の問題を説明するダミーHTMLページは次のとおりです。私はそれを呼ぶテスト.html

<p>
This is the <a href="https://www.google.com/">Google link</a>
</p>

<p>
And these are <a href="https://twitter.com/">Twitter link</a> and <a href="https://www.instagram.com/">Instagram link</a>.
</p>

このコードを使用してリンクを見つけ、それを追加のコンテンツに置き換えます。

sed -E 's/(<a href="[^#]+[-a-zA-Z0-9@:%._\+~#=/?&]+")(>)/\1 target="_blank">/g' test.html

結果は次のとおりです。

<p>
This is the <a href="https://www.google.com/" target="_blank">Google link</a>
</p>

<p>
And these are <a href="https://twitter.com/">Twitter link</a> and <a href="https://www.instagram.com/" target="_blank">Instagram link</a>.
</p>

追加項目に注意してくださいtarget="_blank"。一致するものが複数ない場合、期待どおりに動作します。 1行に一致する項目が複数ある場合は、一番右の項目のみが置き換えられます。ライン全体をブロックとして検出するようです。

これを調査した後、検出ブロックを分割するために否定を追加するよう提案した。だからタグを閉じるために否定を追加しました>。したがって、^>コードは次のようになります。

sed -E 's/(<a href="[^#]+[-a-zA-Z0-9@:%._\+~#=/?&^>]+")(>)/\1 target="_blank">/g' test.html

しかし、これはあまり効果がないようです。たぶん私は何か間違っていたかもしれません。

実行/テストsed 4.7。実行するように設計sed 4.4

答え1

この式は、[^#]+最初のhrefから2番目のhrefの終わりまでのすべての項目と一致します。でのみ始まるリンクを避けたい場合#+

関連情報