私の文字列:
<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