XML (SVG) からファイル名を抜き出す
Get a list of delimited filenames from a text file - Stack Overflow からですが、XML ファイルを通常の awk で扱うのはフォーマットが固定されていれば問題ないのですが、改行がどこにあるのか把握できない場合には危険です。 そうした場合には、xgawk を用います。
ここでは以下のような sample.xml を用います。
<?xml version="1.0" encoding="utf-8"?> <!-- Generator: Adobe Illustrator 13.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 14948) --> <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> <svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="471.677px" height="126.604px" viewBox="0 0 471.677 126.604" enable-background="new 0 0 471.677 126.604" xml:space="preserve"> <rect x="0.01" y="1.27" fill="none" width="471.667" height="125.333"/> <text transform="matrix(1 0 0 1 0.0098 8.3701)"><tspan x="0" y="0" font-family="'MyriadPro-Regular'" font-size="10">/Volumes/Secondary500/Temp/Untitled-2_Layer 1 copy 2.pdf</tspan><tspan x="0" y="12" font-family="'MyriadPro-Regular'" font-size="10">/Volumes/Secondary500/Temp/Untitled-2_Layer 1 copy.pdf</tspan><tspan x="0" y="24" font-family="'MyriadPro-Regular'" font-size="10">/Volumes/Secondary500/Temp/Untitled-2_Layer 1.pdf</tspan></text> </svg>
xgawk で XML から必要なものを抜き出すのは非常に簡単で、通常の awk であるかのように記述できるのが特徴です。 また、表記方法もルーチンになっていますので、覚えておくと便利です。
#! /usr/local/bin/xgawk -f
# pick_from_svg.awk
# SVG ファイルからファイル名を取得する
# usage: xgawk -f pick_from_svg.awk sample.xml
@load xml
BEGIN {
XMLMODE = 1;
XMLCHARSET = "utf-8";
}
XMLCHARDATA {
data = $0;
}
XMLENDELEM == "tspan" {
print data;
}
たったこれだけのコードで XML から必要なもの (ここでは tspan タグに囲まれたファイル名) を抜き出すことができます。 実行してみます。
$ xgawk -f pick_from_svg.awk sample.xml /Volumes/Secondary500/Temp/Untitled-2_Layer 1 copy 2.pdf /Volumes/Secondary500/Temp/Untitled-2_Layer 1 copy.pdf /Volumes/Secondary500/Temp/Untitled-2_Layer 1.pdf
Get a list of delimited filenames from a text file - Stack Overflow には Perl を用いた回答も記載されていますが、xgawk の方が簡単かつ明確に記述できています。 xgawk 自体がそんなにメジャーではないため、Linux 標準で使うようなことができないのが残念です。

