![Bash에서 HTML 문자열 조작](https://linux55.com/image/190342/Bash%EC%97%90%EC%84%9C%20HTML%20%EB%AC%B8%EC%9E%90%EC%97%B4%20%EC%A1%B0%EC%9E%91.png)
그래서 html 파일에서 세 줄을 얻었습니다.
/html>
<table style="width:500px;text-align:left;">
<tr><td>apple</td><td>400</td><td>432</td><td>730</td></tr>
어떻게든 세 번째 행(400, 432, 730)에 표시되는 세 자리 숫자를 가져와서 그 합계(1562)를 apple_num이라는 자체 변수에 할당해야 합니다. 어떤 도움이라도 대단히 감사하겠습니다!
답변1
이를 사용 xmlstarlet
하여 XML을 구문 분석하고 두 번째, 세 번째 및 네 번째 <td/>
요소 값을 선택할 수 있습니다. 추가 테이블과 테이블 행이 있는 경우 더 많은 HTML 콘텐츠를 제공해야 합니다. 그렇지 않으면 적절한 섹션을 선택하는 방법을 직접 알아내야 합니다.
구문 분석을 위한 코드 조각page.html
apple_var=$(
xmlstarlet fo -H page.html |
xmlstarlet sel -t -v 'concat(//td[2],"+",//td[3],"+",//td[4])' -n 2>/dev/null |
bc
)
echo apple_var=$apple_var
산출
apple_var=1562
첫 번째 호출에서는 xmlstarlet
HTML을 구문 분석하고 가능한 경우 이를 XML로 변환합니다. 두 번째 호출은 XML을 구문 분석하고 필요한 <td/>
요소 값과 +
그 사이의 기호를 추출합니다. 파이프라인의 마지막 부분에서는 원하는 결과 값을 제공하는 수학 연산을 수행합니다. 이는 apple_var
필요에 따라 할당됩니다.
답변2
대답은 입력이 얼마나 유연한지에 따라 달라집니다.
우리가 가정한다면
- 번호는 항상 세 번째 줄에 있고,
- 숫자는 항상 정수입니다.
- 세 번째 줄에는 필요한 숫자가 포함되어 있지 않습니다.
그렇다면 아주 간단할 수 있다
apple_num=$(sed -n '3p' file.html | # output the 3rd line
grep -Eo '[0-9]+' | # extract all integers and output then one per line
awk '{s+=$1} END {print s}') # output sum of all the numbers
그러나 이 접근법은매우부서지기 쉬운. 예를 들어 in 도 숫자로 인식되기 <tr><td>apple</td><td>400</td><td style="color: #010203">432</td><td>730</td></tr>
때문에 실패하고 심지어 in 도 숫자로 인식되기 때문에 실패합니다.010203
style="color: #010203"
<tr><td>mars1</td><td>400</td><td>432</td><td>730</td></tr>
1
mars1
물론 더 정확하게 제한할 수도 있습니다. 예를 들면 다음과 같습니다.
apple_num=$(sed -n '3p' file.html | # extract 3rd line
egrep -o '>[0-9]+<' | # extract only parts like >123< (one per line)
egrep -o '[0-9]+' | # extract integers (one per line)
awk '{s+=$1} END {print s}') # output sum of all the numbers
하지만 더 정확할수록 가독성이 떨어집니다. 따라서 일반적으로 다음과 같은 보다 일반적인 접근 방식을 선호해야 합니다.Emma Luo가 제안한 아이템, grep/sed/awk 방법은 임시적이고 빠르고 더러운 단일 라이너에만 사용해야 합니다.