sedでxmlを処理する(<>を消したい)


やりたいこと

owncloud使ってて、APIからPROPFINDしたときに返ってくるXMLから情報を引き出したい
<?xml version..>
などを消し去り、データだけを取り出したいのよ。うん。

何故sed??

いやただ単になんとなく。
shellscriptからいじってるからです〜

1.指定パターンの削除

これは簡単で、

$sed -e 's/消したい文字列//g' <ファイル名>

ってすればいい。

2.パターンを書く

これが割とめんどくって。
パターンについて詳しく/一覧はこちらの「sedでこういう時はどう書く?」がわかりやすかったです。

また、これを書くにあたって一番参考にさせていただいたのがこちらの「ワンライナーでお手軽実行可能なsed入門」の「最短マッチさせる」のトピック。

で、一応出来上がったのが

's/<[^>]*>//g'

これは、<>で囲まれたものを全て消去する

パターン解説

s/<[^>]*>//g
パターン 意味/役割
[] 文字クラス?というらしい。[a-z]ならaからzまでの文字のどれか
[]内の ^ 続く文字以外の文字を指定す流。[^>]>以外の文字のこと
* 前のパターンの繰り返し。今回は [^>]を何度も評価する

言葉で説明(ラフ)すると

s/ -- 置換する設定にする
s/< -- <で始まり、
s/<[^>]... -- >以外の文字のうちのどれか一つの
s/<[^>]* -- 0回以上の繰り返し
s/<[^>]*> -- の後ろが、>で閉じられているもの。
s/<[^>]*> -- つまり、<で始まり、>以外の文字のうちのどれか一つの0回以上の繰り返しの後ろが>で閉じられている、文字列にマッチするわけだ。
s/<[^>]*>// -- //で置換後の文字をなくすことによって、先のパターンにマッチするものを文字のないものに変換=消す。
s/<[^>]*>//g -- gをつけて全てのパターンにマッチする部分を置換する。

...最後の方パターン解説ではない気もしたけどまあいいか

まとめ

<...>を削除するには、

$ sed -e 's/<[^>]*>//g' <ファイル>

でおk!!

ちなみに"..."を消したければ

$ sed -e 's/"[^"]*"//g' <ファイル>

etc...

参考にさせていただいた投稿