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番目と一致している間は最初のものを使用できないためです。 。
答え2
cut
この種の作業が考案された理由は次のとおりです。
$ cut -d'"' -f2 file
https://unix.stackexchange.com/
答え3
すべてを一致させることができます最初 "
そして:
sed 's/^[^"]*"//'
^
これは行の先頭から複数(0個以上*
)の文字と一致します。いいえ二重引用符([^"]
)の後に二重引用符が続きます"
。
答え4
使用gawk
:
awk '{print gensub(/(^.*")(.*")/, "\\2", "g");}' input
このコマンドでは、gawk
組み込みgensub()
関数はbackreference()を使用してすべてのキャプチャグループを2番目のキャプチャグループに置き換えます\\2
。
後続の引用符を削除するには、コマンドを次のように変更できます。
awk '{print gensub(/(^.*")(.*)(")/, "\\2", "g");}' input