![sed를 마지막이 아닌 첫 번째로 표시하는 방법은 무엇입니까?](https://linux55.com/image/179667/sed%EB%A5%BC%20%EB%A7%88%EC%A7%80%EB%A7%89%EC%9D%B4%20%EC%95%84%EB%8B%8C%20%EC%B2%AB%20%EB%B2%88%EC%A7%B8%EB%A1%9C%20%ED%91%9C%EC%8B%9C%ED%95%98%EB%8A%94%20%EB%B0%A9%EB%B2%95%EC%9D%80%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F.png)
내 문자열:
<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