使用shell脚本根据条件从html文件中的多个表中删除行

使用shell脚本根据条件从html文件中的多个表中删除行

需要你的帮助。我在 Linux 机器上有一个 HTML 文件,如果这些表的任何行中都不存在“no”,我想删除一行。

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

我是 shell 脚本编写的新手,我尝试了 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

相关内容