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

使用awk处理与html相关的礼物格式Moodle问题,awk,replace,moodle,gift,Awk,Replace,Moodle,Gift,这基本上是一个awk问题,但它是关于为 格式,因此标记 我想格式化问题中的html代码(Moodle“测试”活动),但我需要用相应的实体替换,因为这些实体将被解释为“真实”html,而不是打印出来。 但是,我希望能够使用常规代码键入问题,并在将文件作为礼物导入Moodle之前对其进行后期处理 我认为awk将是实现这一目标的完美工具 假设我有这个(无效的)Moodle/gift问题: ::q1::[html]This is a question about HTML: <pre> &l

这基本上是一个awk问题,但它是关于为 格式,因此标记

我想格式化问题中的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}
要点:在以下情况下,用
替换

  • 
    使用进程_src2gift.awk:

    awk -f process_src2gift.awk $1.src >$1.gift
    
    BEGIN{print”//这是一个生成的文件!'
    {
    如果($1==“”)#打开“代码”块
    {
    代码=1;
    打印$0;
    }
    其他的
    {
    如果($1==“”)#关闭“代码”块
    {
    代码=0;
    打印$0;
    }
    其他的
    {#如果是“代码块”,则用html实体替换<>
    如果(代码==1)
    {
    gsub(“>”,“\\”;
    
    gsub(“回答自己的问题

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

    • 如所述的第一步
    • 第二步,使用正则表达式将
      定义为字段分隔符,并处理第二个参数($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
    )将是:

    当然,也有局限性:

    • 标记中没有属性
    • 行中只有一对
    • 也许其他人

    有没有任何关于为什么要否决的提示?我错过了什么?没有否决。“他们”可能是这样做的,因为在awk中处理html被认为是一个非初学者;-)。通常情况下,你可以解决这个问题,因此你会继续下去,直到你遇到一个不是基于reg-ex的问题,并且如果不站在你的头上就无法解决(在awk中)然后你需要快速学习html感知流程。(对不起,我不能推荐替代工具)。我看不出有任何理由您不能扩展代码,您必须管理另一个标志var
    code2
    ?来执行相同的替换。祝您好运。@Sheller感谢您提供的信息。我理解使用awk处理html充满了陷阱,但这实际上是一个“附带”的情况,不是处理整个html页面。
    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" }
    
    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
    
    BEGIN { FS="[<][/]?[c][o][d][e][>]"; }
    {
        gsub(">","\\&gt;",$2);
        gsub("<","\\&lt;",$2);
        if( NF >= 3 )
            print $1 "<code>" $2 "</code>" $3
        else
            print $0
    }