【问题标题】:Using awk to process html-related Gift-format Moodle questions使用 awk 处理 html 相关的 Gift-format Moodle 问题
【发布时间】:2020-03-26 11:38:31
【问题描述】:

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

我想在问题中格式化 html 代码(Moodle“测试”活动),但我需要将 替换为相应的实体,因为它们将被解释为“真实”html,而不是打印出来。 但是,我希望能够使用常规代码输入问题并在将文件作为礼物导入 Moodle 之前对文件进行后处理。

我认为 awk 将是执行此操作的完美工具。

假设我有这个(无效的)Moodle/礼物问题:

::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}

关键点:将替换为&amp;lt;&amp;gt;时:

  1. &lt;pre&gt;-&lt;/pre&gt; 块内(假设这些标签单独在一行中)
  2. &lt;code&gt;&lt;/code&gt;之间,中间是任意字符串。

对于第一部分,我很好。我有一个调用 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 脚本代码以处理 &lt;code&gt; 标签内的 hmtl 代码?任何想法 ?我考虑过使用 sed,但我不知道该怎么做。

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

【问题讨论】:

  • 关于为什么不赞成投票的任何提示?我错过了什么point
  • 没有投反对票。 “他们”可能做到了,因为在 awk 中处理 html 被认为是不可行的 ;-) 。通常发生的事情是你可以解决这个问题,所以你继续,直到你遇到一个不是基于正则表达式的问题,并且如果不站在你的头上(在 awk 中)就无法解决,然后你需要学习html 感知进程非常匆忙。 (对不起,我不能推荐替换工具)。我看不出有任何理由不能扩展您必须管理另一个标志 var code2 的代码?执行相同的替换。祝你好运。
  • @shellter 感谢您的信息。我知道用 awk 处理 html 充满了陷阱,但这确实是一个“侧面”案例,它不是关于处理整个 html 页面。

标签: awk replace moodle gift


【解决方案1】:

回答自己的问题。

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

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

shell文件变成:

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
}

当然有限制:

  • &lt;code&gt; 标签中没有属性
  • 一行中只有一对&lt;code&gt;&lt;/code&gt;
  • 可能还有其他人...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-09
    • 1970-01-01
    • 1970-01-01
    • 2012-09-24
    • 1970-01-01
    • 2013-04-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多