ids.txtから、apiまたはwebで始まり、ハイフンの後に数字がちょうど2桁続く行だけを抽出する。
行の一部分ではなく、行全体が指定形式に一致する必要がある。
api-07
web-12
xapi-07
api-7
db-12
api-071適切なGNU grepコマンドはどれか。
grep -Eは拡張正規表現を有効にする。^と$で行全体を固定し、選択と量指定子を組み合わせる。
詳細解説
grep '(api|web)-[[:digit:]]{2}' ids.txt既定のBREでは括弧、選択、波括弧をそのままEREのメタ文字として扱わない。
誤りです。grepの既定は基本正規表現です。
BREでは括弧、|、波括弧の扱いがEREと異なるため、この表記のままでは意図した選択と桁数になりません。
grep -E '(api|web)-[[:digit:]]{2}' ids.txtEREは有効だがアンカーがないため、xapi-07やapi-071の一部分にも一致する。
誤りです。-Eにより中央の形式自体は表現できています。
ただし^と$がないため、前後に余計な文字があるxapi-07やapi-071も部分一致します。
grep -E '^(api|web)-[[:digit:]]{2}$' ids.txt-EでEREを使い、^と$で行全体、{2}で数字2桁を指定する。
正しい選択肢です。-Eが選択と量指定を有効にします。
^から$まで形式を限定するため、api-07とweb-12だけが行全体で一致します。
grep -F '^(api|web)-[[:digit:]]{2}$' ids.txt-Fはパターンを固定文字列として扱うため、正規表現の記号が機能しない。
誤りです。-Fは固定文字列検索です。
^や括弧なども普通の文字として探すため、この入力には一致しません。
実際に確かめる
一時的な検証環境で実行できる例です。
printf '%s
' api-07 web-12 xapi-07 api-7 db-12 api-071 > ids.txt
grep -E '^(api|web)-[[:digit:]]{2}$' ids.txt期待される結果
api-07
web-12理解のポイント
- BREとEREの違い
- ^と$による完全一致
- [[:digit:]]と{2}の組み合わせ
確認時の注意
- 確認環境: GNU grep 3.x / LC_ALL=C
- 入力ファイルを検証用に新規作成します。
- LC_ALL=Cを指定するとロケール差を抑えられます。
基礎のおさらい
完全一致
^pattern$とすると、行頭から行末までがパターンに一致する必要があります。部分一致を除外できます。
BREとERE
grepの既定はBREで、grep -EはEREです。括弧、選択、量指定子の書き方が変わります。
文字クラス
[[:digit:]]はロケールを考慮した数字クラスです。単純な[0-9]との違いが問題になる環境もあります。