概要
コマンドラインやシェルスクリプトで稀に必要になる最短マッチと最長マッチ.
特に最短マッチについては使う度に苦戦しているので書き出しておく.
実践例は、sed, awk, cutコマンド, perl である.
なお、私には正規表現を正確に覚える力が無いので、パターンの意味については別途調べてほしい.
最短一致
文字列「1A:2B:3C:4D」をコロン「:」区切りにする.
このときの最短一致である「1A」を取り出す場合.
sed
$ echo "1A:2B:3C:4D" | sed -n -r 's/([^:]+):(.+)/\1/p'
awk
$ echo '1A:2B:3C:4DF' | \
awk '{ $0 = gensub(/[(.+):](.+)+/, "\\\\2", "G", $0); print $0 }'
cut コマンド
$ echo '1A:2B:3C:4D' | cut -f1 -d':'
perl
$ echo '1A:2B:3C:4D' | perl -pe 's/([^:]+):(.+)/\1/'
最長一致
文字列「1A:2B:3C:4D」をコロン「:」区切りにする.
このときの最長一致である「1A:2B:3C」を取り出す場合.
sed
$ echo "1A:2B:3C:4D" | sed -n -r 's/(.+):(.+)/\1/p'
awk
$ echo '1A:2B:3C:4DF' | \
awk '{ $0 = gensub(/(.+):(.+)+/, "\\\\1", "G", $0); print $0 }'
cut コマンド
$ echo '1A:2B:3C:4D' | cut -f1-3 -d':'
perl
$ echo '1A:2B:3C:4D' | perl -pe 's/(.+):(.+)/\1/'
以上.