您好我有几十个XML文件 我需要这个:
<p begin="00:06:28;12" end="00:00:02;26">
翻译成这个:
<p begin="628.12" end="631.08">
我知道我需要一个简单的awk或sed来做这个,但是要新的;可以有人帮忙
答案 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不会尊重的字符编码(在这种情况下不太可能,但是值得注意这些问题)。