sedを最後ではなく最初に表示する方法は?

sedを最後ではなく最初に表示する方法は?

私の文字列:

<p> <strong>Linux x86_64/AMD64/EM64T</strong><br> Latest Long Lived Branch Version: <a href="https://www.nvidia.com/Download/driverResults.aspx/163238/en-us">450.66</a><br> Latest Short Lived Branch Version: <a href="https://www.nvidia.com/Download/driverResults.aspx/150803/en-us">435.21</a><br> Latest Legacy GPU version (390.xx series): <a href="https://www.nvidia.com/Download/driverResults.aspx/160182/en-us">390.138</a><br> Latest Legacy GPU version (340.xx series): <a href="https://www.nvidia.com/Download/driverResults.aspx/156163/en-us">340.108</a><br> Latest Legacy GPU version (304.xx series): <a href="https://www.nvidia.com/Download/driverResults.aspx/123709/en-us">304.137</a><br> Latest Legacy GPU Version (71.86.xx series): <a href="https://www.nvidia.com/object/linux-display-amd64-71.86.15-driver.html">71.86.15</a><br> Latest Legacy GPU Version (96.43.xx series): <a href="https://www.nvidia.com/object/linux-display-amd64-96.43.23-driver.html">96.43.23</a><br> Latest Legacy GPU Version (173.14.xx series): <a href="https://www.nvidia.com/Download/driverResults.aspx/71303/en-us">173.14.39</a><br> <a href="https://www.nvidia.com/object/linux-amd64-display-archive.html">Archive</a></p>

この文字列をパイプして最後のバージョン番号をsed 's|^.*">\([0-9\.]*\)<.*$|\1|'生成します。173.14.39しかし、私が望むのは450.66最初のバージョン番号です。sedこれを達成するには、上記のパラメータをどのように編集する必要がありますか?

まだ初心者なのでsed詳しい説明をお願いします。

答え1

貪欲なので、.*表現の残りの部分が何でも一致する前に、できるだけ一致します。だから、最初のゲームではなく最後のゲームを得ることです。

解決策は、2つの代替を実行することです。 1つは目的の数字の後にあるすべてのHTMLタグを削除し、もう1つは残りの文字列の先頭にあるタグを削除します。

$ sed -e 's/\([[:digit:]]\)<.*/\1/' -e 's/.*>//' file
450.66

最初の式は、s/\([[:digit:]]\)<.*/\1/文字列の終わりを文字の前にある最初の数字に置き換えます<。私たちは、文字列が次の場所で切り取られることを保証します。最初[[:digit:]]<私たちが使用した後の一致.* 後ろにそのパターン。

この表現は私たちに次の事実を残します。

<p> <strong>Linux x86_64/AMD64/EM64T</strong><br> Latest Long Lived Branch Version: <a href="https://www.nvidia.com/Download/driverResults.aspx/163238/en-us">450.66

2番目の式は、s/.*>//文字列の先頭から最後の文字まで>すべての内容を切り捨てます。ここにあります。頼るできるだけ.*一致させてくださいスタートひも。

答え2

次のように使用できますawk

awk -F 'en-us">|</a>' '{print $2}'

この-Fオプションは、行を分割するときにデフォルト値の代わりに、またはフィールド区切り記号としてawk使用するように指示します。en-us"></a>

次に、正しいフィールドを印刷します。この場合は、がある2番目のフィールドですprint $2

これはすべて、サンプル文字列が変更されないと仮定します。

答え3

貪欲を退治する方法はいくつかあります。これは2段階で行うことができます。最初のものは、最初の一致の後に現れるすべてのものを削除することであり、2番目のものは一致の前に現れたすべてのものを削除することです。

sed -r 's/([0-9]+\.[0-9][^<]*).*/\1/; s/.*>(.*)$/\1/' file

次の方法は普遍的です。文字列から任意のテンプレートを選択できます。

sed -r 's/(>[0-9]+\.[0-9][^<]*)/\1\r/8; s/.*>(.*)\r.*/\1/' file
173.14.39

\r置換コマンドで指定された番号に基づいてテンプレートの最後にフラグを配置し、そのフラグに基づいて選択します。この例では、テンプレート1と2を使用しています。数字で試してみてください

sed -r 's/(>[0-9]+\.[0-9][^<]*)/\1\r/2; s/.*>(.*)\r.*/\1/' file
435.21
sed -r 's/(>[0-9]+\.[0-9][^<]*)/\1\r/1; s/.*>(.*)\r.*/\1/' file
450.66

答え4

awkコマンド

awk -F "en-us" '{gsub(/<.*/,"",$2);print $2 }' l| awk '{gsub(/^">/,"",$0);print }'

Python

#!/usr/bin/python
import re
o=re.compile(r'<.*')
k=open('l','r')
for i in  k:
    j=i.split("en-us")[1]
    print re.sub(o,"",j).replace('">','')

出力

450.66

関連情報