1

私はawkを初めて使用し、すべての文字メトリックを削除し、属性を連結してXMLをかなり圧縮する単純なawkスクリプトの支援が必要です。

入力

<?xml version="1.0"?>
<document>
    <page>
        <block bbox="270 163.717 363.262 224.155">
            <line bbox="270 163.717 274.453 182.669">
                <span bbox="270 163.717 274.453 182.669" font="Helvetica-Bold" size="16.02">
                    <char bbox="270 200.519 284.425 224.155" c="f"/>
                    <char bbox="284.43 200.519 291.082 224.155" c="o"/>
                    <char bbox="291.087 200.519 297.74 224.155" c="o"/>
                </span>
            </line>
            <line bbox="270 200.519 363.262 224.155">
                <span bbox="270 200.519 363.262 224.155" font="Helvetica-Bold" size="19.98">
                    <char bbox="270 200.519 284.425 224.155" c="b"/>
                    <char bbox="284.43 200.519 291.082 224.155" c="a"/>
                    <char bbox="291.087 200.519 297.74 224.155" c="r"/>
                </span>
            </line>
        </block>
    </page>
</document>

希望の出力

<?xml version="1.0"?>
<document>
    <page>
        <block bbox="270 163.717 363.262 224.155">
            <line bbox="270 163.717 274.453 182.669">
                <span bbox="270 163.717 274.453 182.669" font="Helvetica-Bold" size="16.02">foo</span>
            </line>
            <line bbox="270 200.519 363.262 224.155">
                <span bbox="270 200.519 363.262 224.155" font="Helvetica-Bold" size="19.98">bar</span>
            </line>
        </block>
    </page>
</document>

ありがとう!

4

3 に答える 3

1

標準の UNIX シェル ユーティリティを使用した XML 解析はお勧めしません。そのためには、適切な XML パーサーが必要です。

awk 次のコマンドを使用すると、出力が得られます (c=属性が常に<char>XML タグの 2 番目の位置にあると仮定します。

awk 'BEGIN {FS="\""} /<char /{tag = tag $4;}
/<\/span>/{print tag; tag="";} !/<char /' file.xml

出力

<?xml version="1.0"?>
<document>
    <page>
        <block bbox="270 163.717 363.262 224.155">
            <line bbox="270 163.717 274.453 182.669">
                <span bbox="270 163.717 274.453 182.669" font="Helvetica-Bold" size="16.02">
foo
                </span>
            </line>
            <line bbox="270 200.519 363.262 224.155">
                <span bbox="270 200.519 363.262 224.155" font="Helvetica-Bold" size="19.98">
bar
                </span>
            </line>
        </block>
    </page>
</document>
于 2012-05-16T18:35:59.443 に答える
1

次のようなものを試してください

awk '{if (index($0, "<char") == 0) print $0}' xmlfile

編集:このスクリプトを試してください:

gawk '{ if (index($0, "<char") > 0) {mat = gensub(/.*c=\"(.*)\".*/, "\\1", "g"); 
                                     tmp = tmp mat;} 
        else if (index($0, "</span>") > 0)
              { print gensub(/(.*)<\/span>/, "\\1", "g") "  " tmp "\n" $0;
                tmp = "";} 
        else print $0 }' xmlfile

出力:

<?xml version="1.0"?>
<document>
    <page>
        <block bbox="270 163.717 363.262 224.155">
            <line bbox="270 163.717 274.453 182.669">
                <span bbox="270 163.717 274.453 182.669" font="Helvetica-Bold" size="16.02">
                  foo
                </span>
            </line>
            <line bbox="270 200.519 363.262 224.155">
                <span bbox="270 200.519 363.262 224.155" font="Helvetica-Bold" size="19.98">
                  bar
                </span>
            </line>
        </block>
    </page>
</document>
于 2012-05-16T18:19:52.430 に答える
1

XML は適切なツールで処理する必要があることを認識しているにもかかわらず、どうやら awk を使用しているようです。とにかく、これは本当にXSLTの場合であることに注意してください。

Saxon 6 (またはそれ以降)では、次のようなコマンド

java -jar saxon.jar input.xml stylesheet.xslt

次のようなスタイルシートを使用して、目的の結果を生成します。

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template>
  <xsl:template match="span">
    <span>
      <xsl:copy-of select="@*"/>
      <xsl:for-each select="char/@c">
        <xsl:value-of select="."/>
      </xsl:for-each>
    </span>
  </xsl:template>
</xsl:stylesheet>
于 2012-05-16T20:20:25.267 に答える