Sedは正規表現の問題です。 ^から「まで一致します。

Sedは正規表現の問題です。 ^から「まで一致します。

sed長い間正規表現を使わなかったので少し錆びました。少し単純化すると、URLを抽出する入力として次の入力があります。

href="https://unix.stackexchange.com/"

^私はregex101.comの非常に便利なツールを使用して、最初と最初の間のすべてを削除するように式を最適化しました"

s/^.*="//

=しかし、私はこのフラグに頼りたくないので、これは私が望むものではありません。ただし、式を次のように変更すると:

s/^.*"//

最後と最後の間^のすべての項目と一致"し、最初は無視します。

どうやらここに私を失望させる何かが欠けていますが、助けてくれてありがとう。

Arch64でUbuntu 21.04を実行します。

ベストアンサー1

あなたが逃したのは.*一致です貪欲に、できるだけ多くの文字を消費します("最後の文字まで含む)。

"除外「間のすべて」を使用するか、[^"]*Perlなどの貪欲な修飾子を提供する正規表現エンジンに切り替えることができます。.*?

$ printf '%s\n' 'href="https://unix.stackexchange.com/"' | sed 's/^[^"]*"//'
https://unix.stackexchange.com/"

$ printf '%s\n' 'href="https://unix.stackexchange.com/"' | perl -pe 's/^.*?"//'
https://unix.stackexchange.com/"

OTOH、本当に欲しいものがデフォルトのURLであれば、最初の参照と最後の参照の間のすべてを一致させてキャプチャし、逆参照を使用して置き換えることができます。

$ printf '%s\n' 'href="https://unix.stackexchange.com/"' | sed 's/^[^"]*"\(.*\)"/\1/'
https://unix.stackexchange.com/

厳密に言えば、イニシャルは^[^"]*もはや欲を持たない必要はなく、^.*この場合は置き換えることができます。これは、正規表現全体が"2番目と一致している間は最初のものを使用できないためです。 。

おすすめ記事