쉘 스크립트를 사용하여 조건에 따라 HTML 파일의 여러 테이블에서 행 삭제

쉘 스크립트를 사용하여 조건에 따라 HTML 파일의 여러 테이블에서 행 삭제

당신의 도움이 필요합니다. Linux 시스템에 HTML 파일이 있고 이 테이블의 행에 "아니요"가 없으면 행을 삭제하고 싶습니다.

HTML 파일은 다음과 같습니다.

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8" />
    <title>Checking files</title>
  </head>
  <body>              
    <h1>Table 1</h1>
      <p>
        Checking data of yes or no
      </p>
      <table border="1" width="100%">
        <tr>
            <th colspan="7" style="text-align:center"><h2 class="heading">Data 1</h2></th>
          </tr>
          <tr>
            <th>&nbsp;</th>
            <th style="width:33%">Names</th>
        <td>Serial</th>
            <th>Severe?</th>
            <th>Days</th>
            <th>Remark Date</th>
          </tr>

                                                
            <tr class="checks-one">
              <td style="text-align:center"><i class="alert"></i></td>
              <td style="width:33%">Net_one</td>
              <td>int</td>
              <td>yes</td>
              <td>50</td>
              <td>action</td>
            </tr>
                                                
            <tr class="check-two">
              <td style="text-align:center"><i class="alert"></i></td>
              <td style="width:33%">Name_two</td>
              <td>hex</td>
              <td>no</td>
              <td>55</td>
              <td>no action</td>
            </tr>
                                                
            <tr class="check-three">
              <td style="text-align:center"><i class="alert"></i></td>
              <td style="width:33%">Name_three</td>
              <td>hex</td>
              <td>yes</td>
              <td>58</td>
              <td>action</td>
            </tr>
        </table>
            
      <table border="1" width="100%">
        <tr>
            <th colspan="7" style="text-align:center"><h2 class="cert-kind">Data 2</h2></th>
          </tr>

          <tr>
            <th>&nbsp;</th>
            <th style="width:33%">Names</th>
        <td>Serial</th>
            <th>Severe?</th>
            <th>Days</th>
            <th>Remark Date</th>
          </tr>

                                                
            <tr class="checks-one">
              <td style="text-align:center"><i class="alert"></i></td>
              <td style="width:33%">Net_one</td>
              <td>int</td>
              <td>yes</td>
              <td>50</td>
              <td>action</td>
            </tr>
                                                
            <tr class="check-two">
              <td style="text-align:center"><i class="alert"></i></td>
              <td style="width:33%">Name_two</td>
              <td>hex</td>
              <td>no</td>
              <td>55</td>
              <td>no action</td>
            </tr>
                                                
            <tr class="check-three">
              <td style="text-align:center"><i class="alert"></i></td>
              <td style="width:33%">Name_three</td>
              <td>hex</td>
              <td>yes</td>
              <td>58</td>
              <td>action</td>
            </tr>
      </table>
  </body>
</html>

이 html 파일의 출력은 다음과 같습니다.

Table 1
Checking data of yes or no

Data 1
    Names   Serial  Severe? Days    Remark Date
Net_one     int yes 50  action
Name_two    hex no  55  no action
Name_three  hex yes 58  action
Data 2
    Names   Serial  Severe? Days    Remark Date
Net_one     int yes 50  action
Name_two    hex no  55  no action
Name_three  hex yes 58  action

내 예상 결과는 다음과 같습니다

Table 1
Checking data of yes or no

Data 1
    Names   Serial  Severe? Days    Remark Date
Net_one     int yes 50  action
Name_three  hex yes 58  action
Data 2
    Names   Serial  Severe? Days    Remark Date
Net_one     int yes 50  action
Name_three  hex yes 58  action

저는 쉘 스크립팅을 처음 접했고 awk, sed 등과 같은 다양한 방법을 시도했지만 그 중 아무 것도 작동하지 않았습니다. 어떤 도움이라도 대단히 감사하겠습니다.

답변1

awk -v RS="</tr>" '
    !/<td>no<\/td>/{ a=(NR==1 ? "" : a RS) $0 }
    END{ print a }
' file.html

귀하의 구체적인 예에 ​​따르면 이 GNU awk가 트릭을 수행하는 것 같습니다.

  • 줄 구분 기호를 다음으로 설정하세요.</tr>
  • "no" 필드를 포함하지 않는 모든 "행"을 변수에 추가합니다(첫 번째 "행"에 필드 구분 기호를 추가하지 마세요).
  • 다시 생성된 HTML 파일을 인쇄합니다.

한번 시도해보고 그것이 당신에게 효과가 있는지 확인하십시오.


편집: 가장 먼저 떠오르는 것은 변수를 사용하는 것이지만 이는 쉽게 제거할 수 있으며 결과는 다음과 같습니다.

awk -v RS="</tr>" -v ORS="" '!/<td>no<\/td>/{ print (NR==1 ? "" : RS) $0 }' file.html

관련 정보