使用 awk 处理 html 相关的礼品格式 Moodle 问题

Using awk to process html-related Gift-format Moodle questions

这基本上是一个 awk 问题,但它是关于 Moodle 的数据处理 Gift 格式,即标签。

我想格式化问题中的 html 代码 (Moodle "test" activity) 但我需要用相应的实体替换 < 和 >,因为这些将被解释为"real" html,并没有打印出来。 但是,我希望能够使用常规代码输入问题并 post- 在将文件作为礼物导入 Moodle 之前对其进行处理。

我认为 awk 是完成这项工作的完美工具。

说我有这个(无效)Moodle/gift问题:

::q1::[html]This is a question about HTML:
<pre>
<p>some text</p>
</pre>
and some tag:<code><img></code>
{T}

我想要的是一个将其转换为有效礼物问题的脚本:

::q1::[html]This is a question about HTML:
<pre>
&lt;p&gt;some text&lt;/p&gt;
</pre>
and some tag:<code>&lt;img&gt;</code>
{T}

关键点:将<和>替换为&lt;&gt; when:

  1. <pre>-</pre> 集团内(假设这些标签单独在一条线上)
  2. <code></code> 之间,中间有任意字符串。

对于第一部分,我很好。我有一个 shell 脚本调用 awk(实际上是 gawk)。

awk -f process_src2gift.awk .src >.gift

与 process_src2gift.awk:

BEGIN { print "// THIS IS A GENERATED FILE !" }
{
    if( =="<pre>" ) # opening a "code" block
    {
        code=1;
        print [=14=];
    }
    else
    {
        if( =="</pre>" ) # closing a "code" block
        {
            code=0;
            print [=14=];
        }
        else
        { # if "code block", replace < > by html entities
            if( code==1 )
            {
                gsub(">","\&gt;");
                gsub("<","\&lt;");
            }
            print [=14=];
        }
    }
}
END { print "// END" }

然而,我坚持第二个要求..

问题:

  1. 是否可以添加到我的 awk 脚本代码来处理 <code> 标签内的 hmtl 代码?任何的想法 ?我考虑过使用 sed,但我不知道该怎么做。

  2. 也许 awk 不是合适的工具?我愿意接受关于其他(标准 Linux)工具的任何建议。

回答自己的问题。

我通过两步 awk 过程找到了解决方案:

  • 问题中描述的第一步
  • 第二步,使用正则表达式将 <code></code> 定义为字段分隔符,并处理第二个参数 ($2) 上的字符串替换。

shell 文件变为:

echo "Step 1"
awk -f process_src2gift.awk .src >.tmp

echo "Step 2"
awk -f process_src2gift_2.awk .tmp >.gift

rm .tmp

第二个 awk 文件 (process_src2gift_2.awk) 将是:

BEGIN { FS="[<][/]?[c][o][d][e][>]"; }
{
    gsub(">","\&gt;",);
    gsub("<","\&lt;",);
    if( NF >= 3 )
        print  "<code>"  "</code>" 
    else
        print [=11=]
}

当然也有限制:

  • <code> 标签中没有属性
  • 行中只有一对<code></code>
  • 可能还有其他人...