19

8月 19

 

awkを使って一行の中の複数の要素をマッチさせる方法

今年の末にyahooブログがサービスを終了するにともなって、そのブログをwordpressに移行したいという依頼があった。
その中で、インポート用のテキストファイルから画像ファイルのリスト化をする処理の部分でawkを使ったところ、一行に2つ以上のimgタグとsrcが存在した場合、上手く要素を取得できないという問題に行き当たった。

こういう状態↓
dbf3ea701fd1719c9365a88c266f7709.png

私は最初、キャプチャーの位置を()でグルーピングして\1,\2などで取得するという方法しかわからなかった。
しかし、これでは当然、一行に3つ以上の要素がある場合マッチできない。

結局的に以下のコードでうまく行った。

awk 'BEGIN{FS="src=";}
{
	for(i=2;i<=NF;++i){
		if(match($i,/"[^"]*"/)){
			print substr($i,RSTART+1,RLENGTH-2);
		}
	}
}' ./source.txt

フィールドセパレーターを"src="に設定してあげることで、一行はimgタグのsrcで分割される。
iの初期値が2から始まっているのは、awkのカウントは0オリジンではなく、1オリジンであり、なおかつ"src="で区切られたフィールドの2つ目からマッチの試行を行いたいため。
あとは行中のマッチ位置のインデックスをRSTARTとRLENGTHで取得し、substr関数で切り抜く。




No comments yet, be the first.

コメントを残す