Bash에서 HTML 문자열 조작

Bash에서 HTML 문자열 조작

그래서 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

첫 번째 호출에서는 xmlstarletHTML을 구문 분석하고 가능한 경우 이를 XML로 변환합니다. 두 번째 호출은 XML을 구문 분석하고 필요한 <td/>요소 값과 +그 사이의 기호를 추출합니다. 파이프라인의 마지막 부분에서는 원하는 결과 값을 제공하는 수학 연산을 수행합니다. 이는 apple_var필요에 따라 할당됩니다.

답변2

대답은 입력이 얼마나 유연한지에 따라 달라집니다.

우리가 가정한다면

  1. 번호는 항상 세 번째 줄에 있고,
  2. 숫자는 항상 정수입니다.
  3. 세 번째 줄에는 필요한 숫자가 포함되어 있지 않습니다.

그렇다면 아주 간단할 수 있다

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 도 숫자로 인식되기 때문에 실패합니다.010203style="color: #010203"<tr><td>mars1</td><td>400</td><td>432</td><td>730</td></tr>1mars1

물론 더 정확하게 제한할 수도 있습니다. 예를 들면 다음과 같습니다.

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 방법은 임시적이고 빠르고 더러운 단일 라이너에만 사용해야 합니다.

관련 정보