使用 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>
<p>some text</p>
</pre>
and some tag:<code><img></code>
{T}
关键点:将<和>替换为<
和>
when:
- 在
<pre>
-</pre>
集团内(假设这些标签单独在一条线上)
- 在
<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(">","\>");
gsub("<","\<");
}
print [=14=];
}
}
}
END { print "// END" }
然而,我坚持第二个要求..
问题:
是否可以添加到我的 awk 脚本代码来处理 <code>
标签内的 hmtl 代码?任何的想法 ?我考虑过使用 sed,但我不知道该怎么做。
也许 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(">","\>",);
gsub("<","\<",);
if( NF >= 3 )
print "<code>" "</code>"
else
print [=11=]
}
当然也有限制:
<code>
标签中没有属性
- 行中只有一对
<code></code>
- 可能还有其他人...
这基本上是一个 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>
<p>some text</p>
</pre>
and some tag:<code><img></code>
{T}
关键点:将<和>替换为<
和>
when:
- 在
<pre>
-</pre>
集团内(假设这些标签单独在一条线上) - 在
<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(">","\>");
gsub("<","\<");
}
print [=14=];
}
}
}
END { print "// END" }
然而,我坚持第二个要求..
问题:
是否可以添加到我的 awk 脚本代码来处理
<code>
标签内的 hmtl 代码?任何的想法 ?我考虑过使用 sed,但我不知道该怎么做。也许 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(">","\>",);
gsub("<","\<",);
if( NF >= 3 )
print "<code>" "</code>"
else
print [=11=]
}
当然也有限制:
<code>
标签中没有属性- 行中只有一对
<code></code>
- 可能还有其他人...