0

以下のような 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タグの各行に4つの列が必要な出力を画面に出力します

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 行あるため、パフォーマンスが非常に遅くなります。シェルAWKまたはSEDを使用してそれを行うことは可能でしょうか..それを行うために間違ったツールを使用しているだけです。

サイトマップは非常に適切にフォーマットされているため、それを回避するための正規表現のトリックがいくつかあるかもしれません.

改行文字の代わりに複数行で AWK または SED のレコード/行を分割した経験のある人はいますか?

どうもありがとう!

4

3 に答える 3

2

任意の XML または HTML を解析する一般的な方法として正規表現を提案することは絶対にありませんが、これは非常に整形式であるとあなたが言ったので、この場合、通常の警告はおそらく無視できます。

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オプションは、パターン スペースの自動印刷を抑制します。

于 2013-08-15T22:20:14.607 に答える
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
于 2013-08-16T07:17:53.400 に答える
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
于 2013-08-16T01:39:55.853 に答える