1

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

我想在问题中格式化 html 代码(Moodle“测试”活动),但我需要用相应的实体替换 < 和 >,因为这些将被解释为“真实”html,而不是打印。但是,我希望能够使用常规代码输入问题并在将文件作为礼物导入 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;and &gt;when:

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

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

awk -f process_src2gift.awk $1.src >$1.gift

使用 process_src2gift.awk:

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

但是,我坚持第二个要求..

问题:

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

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

4

1 回答 1

1

回答自己的问题。

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

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

外壳文件变为:

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

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

rm $1.tmp

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

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

当然,也有限制:

  • <code>标签中没有属性
  • <code></code>一行中只有一对
  • 可能其他人...
于 2019-12-02T14:04:48.023 回答