タグ内にコンテンツをインポートする必要があるファイルがあります。たとえば、
<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解析用に構築されたライブラリを活用する必要があります。バラよりこの投稿これがなぜ悪い考えなのか調べてください。