sedは、その行の最初のパターン一致のみを印刷します。

sedは、その行の最初のパターン一致のみを印刷します。

私は次のデータを持っています。

<td><a href="data1">abc</a> ... <a href="data2">abc</a> ... <a href="data3">abc</a>

data(上記の行は以下のコードのように参照されます)

data1最初の間に必要なので、"これを"行います。

echo 'data' | sed 's/.*"\(.*\)".*/\1/'

しかし、それは私に返されます最後の文字列"と常につまり、この場合の代わりに"私を返します。data3data1

を得るために、data1私は結局

echo 'data' | sed 's/.*"\(.*\)".*".*".*".*".*/\1/'

data1そう多くの重複なしにこれをどのように得ることができますか?sed

ベストアンサー1

正規.*表現パターンは貪欲であり、可能な限り長い文字列と一致するため、一致する引用符が最後の引用符になります。

ここで区切り文字は単一の文字であるため、逆括弧セットを使用して引用符(たとえば)を除くすべての項目と一致させ、その一致を繰り返すことで引用符ではなく複数の[^"]文字と一致させることができます。

$ echo '... "foo" ... "bar" ...' | sed 's/[^"]*"\([^"]*\)".*/\1/'
foo

もう1つの方法は、最初の参照より前のすべての項目を削除してから、(新しい)最初の参照から始まるすべての項目を削除することです。

$ echo '... "foo" ... "bar" ...' | sed 's/^[^"]*"//; s/".*$//'
foo

Perl正規表現では、疑問符を追加して指定子を貪欲にしないようにすることができ、*できるだけ少ない文字/バイトのみを除くと何でも可能です。+.*?

おすすめ記事