シェルスクリプトでの初回限定マッチ

GNOME Terminal

概要

シェルスクリプトで特定の文字列を検索する際に,初回だけマッチさせたいことがある。

例えば,同じ値が連続することがわかっている場合,1回目だけマッチさせて処理をそこで終了させたほうが効率がいい。

テキストのマッチはawk, grep, sedで行うことがほとんどなので,これらのコマンドでの初回限定マッチの方法を整理する。

awk

awkの場合,awkexit文を実行するとその場でawkの処理を終了できるので,これにより初回限定マッチを実現できる。

printf '%010d\n' | fold -w 1 | awk '/^0/ {print $0; exit}'

何か処理を施す場合も,最後にawkexit文を実行すればよい。

sed

sedの場合も,同じくsedのqコマンドでsedの処理を中断できるので,これにより初回限定マッチを実現できる。

printf '%010d\n' | fold -w 1 | sed -n '/^0/{p; q}'

マッチ対象に対して処理を施したい場合は,pの部分にsで置換する処理などを追加して修正を施す。

grep

grepには-m/--max-countオプションがあるのだが,これはGNU拡張となる。そのため,POSIX準拠だと単独では実現できない。この場合は諦めて素直にhead -n 1コマンドと組み合わせて実現する。

printf '%010d\n' | fold -w 1 | grep ^0 | head -n 1

head -n 1を組み合わせれば,grep以外のawksedについても初回のマッチのみを抽出できるので,簡単で手っ取り早い方法ではある。

ただ,余計なコマンドが増えることと,データの終端まで処理がなされてしまい,効率が悪くなる。そのため,単に初回マッチが必要な場合は,awksedで行うようにしたい。

なお,ほとんどないと思うが,反対に終端限定マッチさせたい場合はtail -n 1を使うしかない。

結論

シェルスクリプトでの初回限定マッチの方法を整理した。テキストの検索は頻繁に行う行う処理で,初回のみのマッチもそれなりに必要な場面に出くわす。

POSIXに準拠した実現方法をここに整理したので,初回限定マッチが必要になったらこれらの方法で対応したい。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です