awk: コマンド構文解析を使用して行を独自に変更します。複数行文字

awk: コマンド構文解析を使用して行を独自に変更します。複数行文字

質問に答えようとしています。これにはコマンドの使用が含まれますrecode。コマンドは特定の行を解析し、残りは変更しないでください。ファイルはxmlファイルです。例:

    <ITEM_ID>foo</ITEM_ID>
    <PRODUCTNAME>bar</PRODUCTNAME>
    <DESCRIPTION><p>foo</p><p> </p><p> </p></DESCRIPTION>
    <URL>bar</URL>
    <IMGURL>foo</IMGURL>
    <IMGURL_ALTERNATIVE></IMGURL_ALTERNATIVE>

必要な出力は次のようになります。

    <ITEM_ID>foo</ITEM_ID>
    <PRODUCTNAME>bar</PRODUCTNAME>
    <DESCRIPTION>&lt;p&gt;foo&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt; &lt;/p&gt;</DESCRIPTION>
    <URL>bar</URL>
    <IMGURL>foo</IMGURL>
    <IMGURL_ALTERNATIVE></IMGURL_ALTERNATIVE>


注:このコマンドはrecode期待どおりに機能します。ラベル変換を避けることはDESCRIPTION後で解決することができ、問題の一部ではありません。

変更する必要がある行はで始まる行です<DESCRIPTION>

私はawk静止画を撮りませんが、予想されるコマンドは次のとおりです。

awk '/<DESCRIPTION>/ { $0 = print $0 "| recode ..html" }1' foo.txt

もちろんこれはうまくいきません。

この目標をどのように達成する必要がありますか?

答え1

getline出力を変数として読み取るには、awkを使用する必要があります。また、録音が期待どおりに機能するようにロケールを正しく設定する必要があります。この試み:

$ LC_ALL=C gawk '/DESCRIPTION/{
        "echo \""$0"\" | recode ..html" | getline ff; print ff
       }' file 
    &lt;DESCRIPTION&gt;&lt;p&gt;foo&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;/DESCRIPTION&gt;

答え2

文書がうまく設定されていて、いくつかのルートノードがあるとしますroot

$ cat file.xml
<root>
    <ITEM_ID>foo</ITEM_ID>
    <PRODUCTNAME>bar</PRODUCTNAME>
    <DESCRIPTION><p>foo</p><p> </p><p> </p></DESCRIPTION>
    <URL>bar</URL>
    <IMGURL>foo</IMGURL>
    <IMGURL_ALTERNATIVE></IMGURL_ALTERNATIVE>
</root>

次に、

$ xmlstarlet ed -u '/root/DESCRIPTION' -v "$( xmlstarlet sel -t -c '/root/DESCRIPTION/*' file.xml )" file.xml
<?xml version="1.0"?>
<root>
  <ITEM_ID>foo</ITEM_ID>
  <PRODUCTNAME>bar</PRODUCTNAME>
  <DESCRIPTION>&lt;p&gt;foo&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt; &lt;/p&gt;</DESCRIPTION>
  <URL>bar</URL>
  <IMGURL>foo</IMGURL>
  <IMGURL_ALTERNATIVE/>
</root>

ここで何が起こるのかは、xmlstarlet selノードの下にあるノードのコピーを取得するために使用されることです/root/DESCRIPTION。それがxmlstarlet sel -t -c '/root/DESCRIPTION/*' file.xmlすることです。文字列を返します<p>foo</p><p> </p><p> </p>

/root/DESCRIPTIONその後、この文字列はコマンドを介してノードの新しいテキスト値として使用されますxmlstarlet ed。新しい値はコマンド置換から来ます。

この値は自動的にXMLでエンコードされます。

関連情報