ファイルからヘッダーとフッターを削除する簡単なコマンド

ファイルからヘッダーとフッターを削除する簡単なコマンド

ファイルから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...しかし、これらの作業はすべて!を使用してよりエレガントで信頼性が高いと思います。

関連情報