私は次のデータを持っています。
<td><a href="data1">abc</a> ... <a href="data2">abc</a> ... <a href="data3">abc</a>
data
(上記の行は以下のコードのように参照されます)
data1
最初の間に必要なので、"
これを"
行います。
echo 'data' | sed 's/.*"\(.*\)".*/\1/'
しかし、それは私に返されます最後の文字列間"
と常につまり、この場合の代わりに"
私を返します。data3
data1
を得るために、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正規表現では、疑問符を追加して指定子を貪欲にしないようにすることができ、*
できるだけ少ない文字/バイトのみを除くと何でも可能です。+
.*?