V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
LUREN
V2EX  ›  问与答

求助一个 shell 循环执行问题

  •  
  •   LUREN · 2020-08-07 22:20:29 +08:00 · 897 次点击
    这是一个创建于 1329 天前的主题,其中的信息可能已经有所发展或是发生改变。

    问题场景:

    需要将一些 HTML 内容转换为表格形式展示,HTML 内容很简单且格式是固定的。需要在服务器上操作,没有权限安装其它运行环境,只好选择 SHELL 脚本完成。

    HTML 内容:

    所有文件的内容格式都如同下面这样。

    <html>
    <head>
    <title>Demo</title>
    </head>
    <body>
        <h1>Page Title</h1>
        <div class="row">
            <p class="text-1">Text 1</p>
            <p class="text-2">Text 2</p>
            <p class="text-3">Text 3</p>
            <p class="text-4">Text 4</p>
            <p class="text-5">Text 5</p>
            <p class="text-6">Text 6</p>
        </div>
        <div class="row">
            <p class="text-1">Text 1</p>
            <p class="text-2">Text 2</p>
            <p class="text-3">Text 3</p>
            <p class="text-4">Text 4</p>
            <p class="text-5">Text 5</p>
            <p class="text-6">Text 6</p>
        </div>
        <div class="row">
            <p class="text-1">Text 1</p>
            <p class="text-2">Text 2</p>
            <p class="text-3">Text 3</p>
            <p class="text-4">Text 4</p>
            <p class="text-5">Text 5</p>
            <p class="text-6">Text 6</p>
        </div>
    </body>
    </html>

    需要转换如下表格格式:

    <table>
        <caption>Page Title</caption>
        <thead>
            <tr>
                <th>Hard Code</th>
                <th>Hard Code</th>
                <th>Hard Code</th>
                <th>Hard Code</th>
                <th>Hard Code</th>
                <th>Hard Code</th>
            </tr>
        </thead>
        <tbody>
            <tr>
                <td>Text 1</td>
                <td>Text 2</td>
                <td>Text 3</td>
                <td>Text 4</td>
                <td>Text 5</td>
                <td>Text 6</td>
            </tr>
            <tr>
                <td>Text 1</td>
                <td>Text 2</td>
                <td>Text 3</td>
                <td>Text 4</td>
                <td>Text 5</td>
                <td>Text 6</td>
            </tr>
            <tr>
                <td>Text 1</td>
                <td>Text 2</td>
                <td>Text 3</td>
                <td>Text 4</td>
                <td>Text 5</td>
                <td>Text 6</td>
            </tr>
        </tbody>
    </table>

    这是一张示意图:

    tfVhU.png

    为方便提取 HTML 内容,选用了 pup 这个工具 https://github.com/ericchiang/pup

    它基于 CSS 选择器工作,例如要提取的内容使用下面命令。

    # Extracting page titles
    cat demo.html | pup 'body > h1 text{}'
    
    # Extracting paragraph text
    cat demo.html | pup 'body > div.row > p.text-1 text{}'
    cat demo.html | pup 'body > div.row > p.text-2 text{}'
    cat demo.html | pup 'body > div.row > p.text-3 text{}'
    cat demo.html | pup 'body > div.row > p.text-4 text{}'
    cat demo.html | pup 'body > div.row > p.text-5 text{}'
    cat demo.html | pup 'body > div.row > p.text-6 text{}'

    于是写了下面这个 SHELL 脚本(没写过 SHELL 脚本的小白……)

    #!/usr/bin/env bash
    
    # Extracts HTML content
    page_title=$(cat demo.html | pup 'body > h1 text{}')
    paragraph_text_a=$(cat demo.html | pup 'body > div.row > p.text-1 text{}')
    paragraph_text_b=$(cat demo.html | pup 'body > div.row > p.text-2 text{}')
    paragraph_text_c=$(cat demo.html | pup 'body > div.row > p.text-3 text{}')
    paragraph_text_d=$(cat demo.html | pup 'body > div.row > p.text-4 text{}')
    paragraph_text_e=$(cat demo.html | pup 'body > div.row > p.text-5 text{}')
    paragraph_text_f=$(cat demo.html | pup 'body > div.row > p.text-6 text{}')
    
    # Print the contents in a predetermined format
    cat << EOF
    <table>
        <caption>$page_title</caption>
        <thead>
            <tr>
                <th>Hard Code</th>
                <th>Hard Code</th>
                <th>Hard Code</th>
                <th>Hard Code</th>
                <th>Hard Code</th>
                <th>Hard Code</th>
            </tr>
        </thead>
        <tbody>
            <tr>
                <td>$paragraph_text_a</td>
                <td>$paragraph_text_b</td>
                <td>$paragraph_text_c</td>
                <td>$paragraph_text_d</td>
                <td>$paragraph_text_e</td>
                <td>$paragraph_text_f</td>
            </tr>
        </tbody>
    </table>
    EOF

    上面的脚本显然不能正常工作,输出内容都写在一行表格里了。正常应该每个 <div class="row">...</div> 块内容转换一行表格内容。

    所以这里请教下各位大佬,应该怎么修改可以让它按预期工作?折腾了好久没解决……

    2 条回复    2020-08-08 05:02:23 +08:00
    oneisall8955
        1
    oneisall8955  
       2020-08-07 23:11:50 +08:00 via Android
    坐等大佬们撸一个人,(话说,学会正则应该很简单吧,shell 需要学习一些语法,新手应该觉得有点费时间咯)
    ysc3839
        2
    ysc3839  
       2020-08-08 05:02:23 +08:00 via Android
    既然可以用 pup,那就直接用 golang 写个程序处理吧,别用 shell 了。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1002 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 20:03 · PVG 04:03 · LAX 13:03 · JFK 16:03
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.