Perlのワンライナー(XMLの特定の要素を抽出、加工する。)
こんなXMLの内容の、「カテゴリ」の要素を引っこ抜きたい場合。
<lst name="facet_fields"> <lst name="カテゴリ"> <int name="カテゴリ1">70794</int> <int name="カテゴリ2">61133</int> <int name="カテゴリ3">51198</int> <int name="カテゴリ4">30447</int> <int name="カテゴリ5">26365</int> <int name="カテゴリ6">24425</int> <int name="カテゴリ7">16539</int> <int name="カテゴリ8">12921</int> <int name="カテゴリ9">7802</int> <int name="カテゴリ10">4534</int> <int name="カテゴリ11">3539</int> <int name="カテゴリ12">3432</int> <int name="カテゴリ13">2045</int> <int name="カテゴリ14">918</int> <int name="カテゴリ15">410</int> </lst> </lst>
こう書くといける。
perl -0777 -pe "s|^.*<lst name=\"facet_fields\">.*<lst name=\"カテゴリ\">(.*?)</lst>.*|\$1|sg" カテゴリ.xml
$1の前の\を書き忘れて1時間くらいハマった。「カテゴリ」の部分を変数にしたい場合、
置換の指示をダブルクォートで囲まないといけないので、ダブルクォートをエスケープする他に
$もエスケープしないといけないことに注意。
追記
ってーかコレ「Perlの文字列内に$があるときはエスケープしないとエラーになる。」でハマってたやん・・・orz