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

탐욕 스럽기 때문에 .*표현의 나머지 부분이 무엇이든 일치하기 전에 가능한 한 많이 일치합니다. 그렇기 때문에 첫 번째 게임이 아닌 마지막 게임을 얻는 것입니다.

해결책은 두 가지 대체를 수행하는 것입니다. 하나는 원하는 숫자 뒤의 모든 HTML 태그를 제거하고, 다른 하나는 나머지 문자열의 시작 부분에 있는 태그를 제거합니다.

$ 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

두 번째 표현식은 s/.*>//문자열의 시작 부분부터 마지막 ​​문자까지 >모든 내용을 자릅니다. 여기 있어요의지하다최대한 .*많이 일치시키세요시작끈.

답변2

다음과 같이 사용할 수 있습니다 awk.

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

-F옵션은 행을 분할할 때 기본값 대신 또는를 필드 구분 기호로 awk사용하도록 지시합니다.en-us"></a>

그런 다음 올바른 필드를 인쇄하십시오. 이 경우에는 가 있는 두 번째 필드입니다 print $2.

이것은 모두 예제 문자열이 변경되지 않는다고 가정합니다.

답변3

탐욕을 퇴치하는 방법에는 여러 가지가 있습니다. 이 작업은 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 }'

파이썬

#!/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

관련 정보