用于翻译XML的bash脚本

时间:2010-01-14 20:55:09

标签: xml bash scripting

您好我有几十个XML文件 我需要这个:

<p begin="00:06:28;12" end="00:00:02;26">

翻译成这个:

<p begin="628.12" end="631.08">

我知道我需要一个简单的awk或sed来做这个,但是要新的;可以有人帮忙

4 个答案:

答案 0 :(得分:5)

XSL样式表会更可靠。您可以从shell脚本中运行一个。

答案 1 :(得分:3)

啊鬼狗74打败了我。然而,我也处理ms。

awk '
    function timeToMin(str) {
        time_re = "([0-9][0-9]):([0-9][0-9]):([0-9][0-9]);([0-9][0-9])"

        # Grab all the times in seconds. 
        s_to_s =  gensub(time_re, "\\3", "g", str);
        m_to_s = (gensub(time_re, "\\2", "g", str)+0)*60;
        h_to_s = (gensub(time_re, "\\1", "g", str)+0)*60*60;
        ms     =  gensub(time_re, "\\4", "g", str);

        # Create float.
        time_str = (h_to_s+m_to_s+s_to_s)"."ms;

        # Converts from num to str.
        return time_str+0; 
    }
    function addMins(aS, bS) {
        # Split by decimal point
        split(aS, aP, ".");
        split(bS, bP, ".");

        # Add the seconds and ms.
        min = aP[1]+bP[1];
        ms  = aP[2]+bP[2];
        if (ms > 59) {
            ms = ms-60;
            mins++;
        }

        # Return addition.
        return (min"."ms)+0;
    }
    {
        re = "<p begin=\"(.+)\" end=\"(.+)\">";
        if ($0 ~ re) {
            # Pull out the data.
            strip_re = ".*"re".*";
            begin_str = gensub(strip_re, "\\1", "g");
            end_str   = gensub(strip_re, "\\2", "g");

            # Convert.
            begin = timeToMin(begin_str);
            end   = timeToMin(end_str);

            elapsed_end=addMins(begin, end);

            sub(re,"<p begin=\""begin"\" end=\""elapsed_end"\">");
        }

        print $0;
    }
' file

答案 2 :(得分:1)

这是开始的事情。我不知道你想如何添加小数值,所以你自己动手

awk '/.*<p[ ]+begin=.*[ ]+end=.*/{
    o=$0
    gsub(/.*begin=\042|\042|>/,"")
    m=split($0,s,"end=")
    gsub(/[:;]/," ",s[1])
    gsub(/[:;]/," ",s[2])
    b=split(s[1],begin," ")
    e=split(s[2],end," ")
    # do date maths here
    if (b>3){
        tbegin=(begin[1]*3600) + (begin[2]*60) + begin[3]  ##"."begin[4]
    }else{
        tbegin=(begin[1]*60) + begin[3]  ##"."begin[4]
    }
    # add the decimal yourself
    if(e>3) {
        tend = (end[1]*3600) +(end[2]*60)+end[3]+ tbegin ##"."end[4]
    }else{
        tend = (end[1]*60)+end[3]+ tbegin ##"."end[4]
    }
    string=gensub("(.*begin=\042).*( end=\042)(.*)\042>", "\\1" tbegin "\042\\2" tend"\042>","g",o)
    $0=string
}
{print}
' file

例如

$ cat file
<p begin="00:06:28;12" end="00:00:02;26">
<p begin="00:08:45;12" end="00:00:23;26">
<p begin="08:45;12" end="00:2;26">

$ ./shell.sh
<p begin="388" end="390">
<p begin="525" end="548">
<p begin="492" end="518">

如果您正在执行除此之外的更复杂的任务,请使用解析器。

答案 3 :(得分:0)

我建议将Perl(或其他脚本语言)与XML解析模块一起使用(有关Perl和XML的更多详细信息,请参阅here)。

通过这种方式,您可以可靠地解析XML并以编程形式提取/操作值。请可靠地记下这个词。你的XML可能会使用一个简单的sed / awk不会尊重的字符编码(在这种情况下不太可能,但是值得注意这些问题)。