シェルスクリプトでの初回限定マッチ
概要
シェルスクリプトで特定の文字列を検索する際に,初回だけマッチさせたいことがある。
例えば,同じ値が連続することがわかっている場合,1回目だけマッチさせて処理をそこで終了させたほうが効率がいい。
テキストのマッチはawk
, grep
, sed
で行うことがほとんどなので,これらのコマンドでの初回限定マッチの方法を整理する。
awk
awk
の場合,awk
のexit
文を実行するとその場でawk
の処理を終了できるので,これにより初回限定マッチを実現できる。
printf '%010d\n' | fold -w 1 | awk '/^0/ {print $0; exit}'
何か処理を施す場合も,最後にawk
のexit
文を実行すればよい。
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
以外のawk
とsed
についても初回のマッチのみを抽出できるので,簡単で手っ取り早い方法ではある。
ただ,余計なコマンドが増えることと,データの終端まで処理がなされてしまい,効率が悪くなる。そのため,単に初回マッチが必要な場合は,awk
やsed
で行うようにしたい。
なお,ほとんどないと思うが,反対に終端限定マッチさせたい場合はtail -n 1
を使うしかない。
結論
シェルスクリプトでの初回限定マッチの方法を整理した。テキストの検索は頻繁に行う行う処理で,初回のみのマッチもそれなりに必要な場面に出くわす。
POSIXに準拠した実現方法をここに整理したので,初回限定マッチが必要になったらこれらの方法で対応したい。