【问题标题】:How to convert txt into html format using shell/bash如何使用 shell/bash 将 txt 转换为 html 格式
【发布时间】:2017-05-10 14:35:11
【问题描述】:

我在一个文本文件中有以下数据:

Details_A
name: A1
Valid: A1_Value
name: A2
Valid: A2_Value
Details_A2
name: A2
Valid: A2_Value
name: A2
Valid: A2_Value

我试图在下面的 html 表中转换为:

详情

【问题讨论】:

  • 你为什么把自己限制在一个 shell 中?这是某种自我锻炼还是技术限制?就个人而言,只要数据没有错误,任何类型的正则表达式搜索和替换都应该很容易。
  • 我在 prod aix env 服务器中编写它,我无权更改任何内容,所以是的,存在技术限制。
  • 你试过什么?我们这里的大多数人都很乐意帮助你提高你的手艺,但作为短期无偿编程人员不太乐意。在MCVE 中向我们展示您迄今为止的工作、您期望的结果和您得到的结果,我们将帮助您解决问题。
  • @ghoti 我已经在s000.tinyupload.com/?file_id=74381407772679912016 上传了我当前的工作我在 AIX 服务器中使用 awk。
  • @user0,请将您的代码放入您的问题中。外部链接有随时间消失的习惯。如果您使用 awk 编写,请使用 awk 标记您的问题。现在它被标记为好像你想要 /bin/sh 或 bash 中的解决方案。查看 SO how to ask 指南,了解如何将其转化为好问题。

标签: html bash shell awk aix


【解决方案1】:

你可以像这样使用awk

awk 'BEGIN { 
        x = 0;
        print "<table border="1">"
    }
    {
        if (NF == 1){
            print "<tr ><td colspan="2">"$i"</td>";
            print "</tr>"
        } else {
            if (x == 0){
                x++;
                print "<tr><td>"$i"</td>"
            } else {
                x = 0;
                print "<td>"$i"</td></tr>"
            }
        }
    }
    END {
        print "</table>"
    }' input.txt > table.html

随意添加任何其他样式

对于较旧版本的 awk,您可以使用以下内容,在 2009-11-26 的 awk 实现上进行测试(来自 one-true-awk):

awk  'BEGIN {
        x = 0;
        y = 0;
        print "<table border="1">"
    }
    {
        for (i = 1; i<=NF ; i++){

            if (NF == 1){
                print "<tr ><td colspan="2">"$i"</td></tr>";
            } else {

                if (x == 0 && y == 0){
                    print "<tr><td>"$i" ";
                    x++;
                }
                else if (x == 0 && y == 1){
                    print "<td>"$i" ";
                    x++;
                }
                else if (x==(NF-1)){
                    x = 0;
                    y++;
                    if (y == 2){
                        y = 0;
                        print ""$i"</td></tr>";
                    }
                    else{
                        print ""$i"</td>";
                    }
                }
                else {
                    print ""$i" ";
                    x++;
                }
            }
        }
    }
    END {
        print "</table>"
    }' input.txt > table.html

对于最后一个版本,x 在每个空格分隔符处递增,直到我们到达最后一个单词NF-1,我们应该以&lt;/td&gt; 结尾。结束 &lt;/tr&gt; 的决定取决于 y 的值,该值在每一行递增,并在达到 &lt;td&gt; 的最大计数时重新初始化(这里每个 &lt;tr&gt; 2 个 &lt;td&gt;

【讨论】:

  • 以上代码在我安装了 gawk 的本地完美运行。但是它在我有 awk 并且我无法找到它的版本的 AIX 系统上失败了。我试过 awk --version,awk -W 版本。出现以下错误:出现以下错误:awk:0602-562 字段 $() 不正确。输入行号为 1。文件为 IIB_SSL 源行号为 8。
  • 我重新编译了 awk(2009 年)的“不那么旧”版本并重现了这个问题,我更新了答案,这是必要的 for (i = 1; i&lt;=NF ; i++)。如果您有其他问题,我可以使用旧版本进行测试
  • 我在本地尝试过,它产生了意外的 o/p。 s24.postimg.org/6avqfvnwl/Capture.jpg
  • 是否对Details_A有效名称:A1有效:A1_Value
  • @BertrandMartel,当您说“使用 2009-11-26 的 awk 版本进行测试”时,您指的是哪个版本的 awk? One true awk?还是一些衍生物?
猜你喜欢
  • 2017-07-13
  • 1970-01-01
  • 2015-07-20
  • 1970-01-01
  • 1970-01-01
  • 2014-01-20
  • 1970-01-01
  • 1970-01-01
  • 2016-12-26
相关资源
最近更新 更多