Bashスクリプト - タグ内のテキスト出力

Bashスクリプト - タグ内のテキスト出力

タグ内にコンテンツをインポートする必要があるファイルがあります。たとえば、

<Model500>
ABC
BCD 
CDE
</Model500>


<Model500>
123
234
345
</Model500>

の内容を抽出したい。

<Model500>
</Model500>

「sed」を使用

だからそれは

ABC
BCD
CDE

123
234
345

使ってみました。

sed -e 's/<Model>\,/</Model>/p' file.txt

しかし、特殊文字で問題が発生しました。どんな提案がありますか?ありがとうございます。

答え1

入力がXMLの場合は、XML関連ツールを使用するのが最善です。

方法1

sed正規表現にaを含める1つの方法は、/バックスラッシュを使用してエスケープすることです。

$ sed -ne '/<Model500>/,/<\/Model500>/p' file.txt
<Model500>
ABC
BCD 
CDE
</Model500>
<Model500>
123
234
345
</Model500>

この式は/<Model500>/,/<\/Model500>/行の範囲を指定します。範囲は一致する行で始まり<Model500>、一致する行で終わります<\/Model500>。代替コマンドではなく範囲を指定するため、式はで始まりませんs

方法2

エスケープしたくない場合は、別の区切り文字を使用できます。

$ sed -ne '\|<Model500>|,\|</Model500>|p' file.txt
<Model500>
ABC
BCD 
CDE
</Model500>
<Model500>
123
234
345
</Model500>

ここでは区切り記号として使用します|/区切り記号以外の区切り文字が範囲で使用されたことを示すには、最初の区切り文字をエスケープする必要があります\|

答え2

文字列には</Model>この/文字が含まれているため、sed式からこの文字をエスケープするか、他の文字を使用してsed式を区切る必要があります。幸いなことに、sedは任意の単一文字を使用して式を区切ることができるため、入力に表示されない文字を選択するだけです。

より一般的には、sedは現在の作業に最適な選択ではないかもしれません。 XMLファイルを解析するようですので、sedで何かをハックするのではなく、XML解析用に構築されたライブラリを活用する必要があります。バラよりこの投稿これがなぜ悪い考えなのか調べてください。

関連情報