ファイルからXMLヘッダーとフッターを削除するコマンドが必要です。
<?xml version="1.0" encoding="UTF-8"?>
<conxml>
<MsgPain001>
<HashValue>A9C72997C702A2F841B0EEEC3BD274DE1CB7BEA4B813E030D068CB853BCFECA6</HashValue>
<HashAlgorithm>SHA256</HashAlgorithm>
<Document>
...
</Document>
<Document>
...
</Document>
</MsgPain001>
</conxml>
...
正当化されなければならない
<Document>
...
</Document>
<Document>
...
</Document>
(インデントに注意してください。最初のドキュメントタグのインデントを削除する必要があります。
これは(貪欲な)正規表現のように聞こえます。
<Document>.*</Document>
しかし、改行文字のため理解できません。
埋め込み文書のハッシュを計算するには、パイプラインにこの情報が必要です。
答え1
使用sed
:
sed -n '/<Document>/,/<\/Document>/ p' yourfile.xml
説明する:
-n
沈黙のままですsed
。つまり、ファイル全体の内容を出力しません。/pattern/
探す指定されたパターンを含む行の場合a
,
b
(カンマ)はsed
実行を示します.行動a
から までの路線でb
(ここで合計は上記のパターンと一致して定義さa
れます)b
p
代表する印刷そして行動上記と一致する行で実行します。
編集する:前のスペースをさらに削除するには<Document>
:
sed -ne '/ <Document>/s/^ *//' -e '/<Document>/,/<\/Document>/ p' yourfile.xml
答え2
</Document>
次のテキストの間でテキストが削除されないようにするには、一連の<Document>
コマンドを使用する必要がありますsed
(上記のGillesの説明を参照)。
デフォルトでは、sed
ファイル全体が保持バッファに読み込まれ(ファイルの内容が1行で処理されるように)、さらにDocument
処理するために最初と最後のタグが表示されます。
# version 1
# marker: HERE
cat file.xml |
sed -n '1h;1!H;${;g;s/\(<Document>.*<\/Document>\)/HERE\1HERE/g;p;}' |
sed -n -e '/HERE<Document>/,/<\/Document>HERE/ p' |
sed -e 's/^ *HERE\(<Document>\)/\1/' -e 's/\(<\/Document>\)HERE *$/\1/'
# version 2 (using the Bash shell)
# marker: $'\001'
cat file.xml |
sed -n $'1h;1!H;${;g;s/\\(<Document>.*<\\/Document>\\)/\001\\1\001/g;p;}' |
sed -n -e $'/\001<Document>/,/<\\/Document>\001/ p' |
sed -e $'s/^ *\001//' -e $'s/\001 *$//' |
cat -vet
xmlstarlet
...しかし、これらの作業はすべて!を使用してよりエレガントで信頼性が高いと思います。