Sedはhttp://で始まらないいくつかの行を置き換えます。

Sedはhttp://で始まらないいくつかの行を置き換えます。

sedに閉じ込められた。 htmlファイルのリンクがhttpで始まらないときに/をプレフィックスとして使用しようとしています。これがこの問題を解決する最善の方法ではないかもしれないことを知っていますが、シンプルで迅速なソリューションを探しています。

これまで私はこれを試しました。 (IRLでは-i in placeフラグなどを使用します。これは単にテスト用です。)

echo '<a href="egww">blah</a><a href="http://bloge.weg">yeah</a>' |
sed 's@href="[^http]@href="/@g'

これはほとんど動作します。

<a href="/gww">blah</a><a href="http://bloge.weg">yeah</a>

最初のリンクの最初の文字が切り捨てられる以外に、h、t、t、またはpが一致しないのではなく、http文字列全体が一致しないようです。

echo '<a href="egww">blah</a><a href="p/bloge.weg">damn</a>' |
sed 's@href="[^http]@href="/@g'

<a href="/gww">blah</a><a href="p/bloge.weg">damn</a>

私はこの時点で混乱し、残念ながらここではインターネット検索はあまり役に立ちません。なぜなら、sedの否定は通常、一致しない行の部分文字列ではなく、文字列を含む行を削除するために使用されるからです。いくつかの「一般的な」正規表現パターンを試しましたが、うまくいかないようです。

どんなアイデアがありますか?

答え1

[^http]いいえとは別にhttp。このREはh、nor t、nor以外の文字と一致しますp。したがって、ではhref="[^http]一致しますが、一致しません。href="bhref="blah"href="thref="toto"

ここでは、次のようなものが欲しい。

sed -E 's@(href=")([^h]|h([^t]|t([^t]|t([^p]|$)|$)|$)|$)@\1/\2@g'

後には、href="not- h(以外の文字h)、h-not t-、ht-not t-、htt- not- phtt-EOL、ht-EOL、h-EOL、またはEOLが続きます。 (EOL ==「行末」、最後の4つは"不一致を意味するため、入力で見つかる可能性はありません。)

sed(まだ標準ではないオプションをサポートしていると仮定-E)。

/Alwaysを追加してwhenの後に削除することもできますhref="/http

sed 's@href="@&/@g;s@href="/http@href="http@g'

または以下を使用してperl

perl -pe 's|href="\K(?!http)|/|g'

perl否定予測RE演算子を使用してください。

関連情報