我有30个站点地图文件如下所示:
<?xml version="1.0" encoding="UTF-8"?><urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url>
<loc>http://www.A.com/a</loc>
<lastmod>2013-08-01</lastmod>
<changefreq>weekly</changefreq>
<priority>0.6</priority>
</url>
<url>
<loc>http://www.A.com/b</loc>
<lastmod>2013-08-01</lastmod>
<changefreq>weekly</changefreq>
<priority>0.6</priority>
</url>
...
</urlset>
输出我希望每个url标记的每行有四列,打印到屏幕
http://www.A.com/a 2013-08-01 weekly 0.6
http://www.A.com/b 2013-08-01 weekly 0.6
我使用的方式是Python BeautifulSoup来解析标签,但是,性能非常慢,因为那里有30多个文件,每个文件有300,000行。我想知道是否有可能使用一些shell AWK或SED来做那个或..我只是使用错误的工具来做到这一点。
由于站点地图格式很好,可能会有一些正则表达式技巧来解决它。
任何人都有经验将AWK或SED中的记录/行除以多行代替新行字符?
非常感谢!
答案 0 :(得分:2)
我绝对不会建议将正则表达式作为解析任意XML或HTML的一般方法,但由于你说这是格式良好的,所以在这种情况下usual warning可能会被忽略:
sed -n '/^<url>$/{n;N;N;N;s/\n/ /g;s/ *<[a-z]*>//g;s/<\/[a-z]*>/ /g;p}'
这是一个注释版本,解释了发生了什么:
sed -n '/^<url>$/ { # if this line contains only <url>
n;N;N;N # read the next 4 lines into the pattern space
s/\n//g # remove newlines
s/ *<[a-z]*>//g # remove opening tags and the spaces before them
s/<\/[a-z]*>/ /g # replace closing tags with a space
p # print the pattern space
}' test.txt
-n
选项禁止自动打印模式空间。
答案 1 :(得分:1)
sed是一个很好的工具,可以在一行上进行简单的替换,其他任何东西只需使用awk:
$ awk -F'[<>]' '
/^<\/url>/ { inUrl=0; print line }
inUrl { line = line (line?" ":"") $3 }
/^<url>/ { inUrl=1; line="" }
' file
http://www.A.com/a 2013-08-01 weekly 0.6
http://www.A.com/b 2013-08-01 weekly 0.6
答案 2 :(得分:1)
这可能适合你(GNU sed):
sed '/^<url>/!d;:a;N;/<\/url>/!ba;s/<[^>]*>\s*<[^>]*>/ /g;s/^ \| $//g' file
在模式空间中收集url
行,用空格替换标记并删除前导和尾随空格。所有其他行都将被删除。
如果您知道url
代码之间只有4行:
sed '/^<url>/!d;N;N;N;N;s/<[^>]*>\s*<[^>]*>/ /g;s/^ \| $//g' file