这基本上是一个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>
<p>some text</p>
</pre>
and some tag:<code><img></code>
{T}
关键点:在以下情况下,用<
和>
替换:
<pre>
-</pre>
块内部(假设这些标记单独位于一行上)<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(">","\\>");
gsub("<","\\<");
}
print $0;
}
}
}
END { print "// END" }
但是,我坚持第二个要求。
问题:
是否可以添加到我的awk脚本代码中以处理<code>
标签内的hmtl代码?任何的想法 ?我曾考虑过使用sed,但我不知道该怎么做。
也许awk不是正确的工具吗?我愿意接受其他(标准Linux)工具的建议。
回答自己的问题。
我通过执行两步awk过程找到了解决方案:
<code>
或</code>
定义为字段定界符,并处理第二个参数($ 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(">","\\>",$2);
gsub("<","\\<",$2);
if( NF >= 3 )
print $1 "<code>" $2 "</code>" $3
else
print $0
}
当然有限制:
<code>
标记中没有属性<code></code>