質問に答えようとしています。これにはコマンドの使用が含まれます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><p>foo</p><p> </p><p> </p></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
<DESCRIPTION><p>foo</p><p> </p><p> </p></DESCRIPTION>
答え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><p>foo</p><p> </p><p> </p></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でエンコードされます。