読むだけでちょっと賢くなる、架空のまとめスレ

【疑問】grep で「数字3桁-数字4桁」を探したいのに + が効かん。基本と拡張の正規表現【LPICレベル1】

25レスカテゴリ:Linux
1: 名無しさん

123-4567 みたいな番号が書いてある行を探したくて grep '[0-9]+-[0-9]+' file.txt と打った
1行も出てこん

2: 名無しさん

>>1
grep はそのままだと、基本正規表現(BRE)として読む。BRE では + はただの文字
grep -E(拡張正規表現、ERE)にすると、+ が「直前のものの1回以上のくり返し」になる

3: 名無しさん

>>2
grep -E '[0-9]+-[0-9]+' file.txt やな

4: 名無しさん

>>3
それで出る。桁数まで決めたいなら、{} で回数を指定する
grep -E '[0-9]{3}-[0-9]{4}' file.txt
[0-9]{3} に当てはまる文字列は、 から までの 通り

5: 名無しさん

>>4
それやと 9123-45678 みたいな行にも当たるやろ

6: 名無しさん

>>5
当たる。grep は、行の一部にでも当てはまればその行を出す
行全体をその形にしたいなら、行頭の ^ と行末の $ でしばる。grep -E '^[0-9]{3}-[0-9]{4}$' file.txt

7: 名無しさん

基本正規表現のままで、同じことはできんの

8: 名無しさん

>>7
できる。BRE では、バックスラッシュをつけた \{ \} が回数の指定になる
grep '^[0-9]\{3\}-[0-9]\{4\}$' file.txt
GNU の grep なら、BRE でも \+ が1回以上の意味で使える

9: 名無しさん

>>8
BRE と ERE の違いをまとめてほしい

10: 名無しさん

>>9
ERE ではそのまま特別な意味になる + ? | ( ) { } が、BRE ではバックスラッシュをつけたときだけ特別になる
. * [ ] ^ $ は、どっちでも最初から特別
egrep は grep -E、fgrep は grep -F(正規表現を使わず、文字列そのものを探す)と同じ

11: 名無しさん

. と * の意味がいまいち分からん

12: 名無しさん

>>11
. は改行以外の任意の1文字、* は直前の文字の0回以上のくり返し
a.c は abc にも a-c にも当たる。ab*c は ac、abc、abbc に当たる
.* で「何でもいいから0文字以上」

13: 名無しさん

>>12
シェルの * と同じやと思ってた

14: 名無しさん

>>13
別物。シェルの *.txt の * は「任意の文字列」(ファイル名の展開)で、正規表現の * は「直前の文字のくり返し」
正規表現をクォートで囲まずに書くと、grep に渡る前にシェルがファイル名として展開してしまうことがある。正規表現はシングルクォートで囲む

15: 名無しさん

よく使うオプションは?

16: 名無しさん

>>15
-i 大文字と小文字を区別しない、-v 当てはまらない行を出す、-n 行番号をつける、-c 当てはまった行の数、-r ディレクトリの中を再帰的に探す
grep -v '^#' app.conf で、コメント行を除いた設定だけ見られる

17: 名無しさん

>>16
空行も消したいときは?

18: 名無しさん

>>17
空行は「行頭のすぐ後ろが行末」やから ^$
grep -v -e '^#' -e '^$' app.conf で、コメント行と空行の両方を除ける

19: 名無しさん

[^0-9] の ^ は、行頭の意味じゃないん?

20: 名無しさん

>>19
[ ] の中の先頭に置いた ^ は「それ以外」の意味。[^0-9] は数字以外の1文字
[ ] の外の ^ が行頭。同じ記号でも、置く場所で意味が変わる

21: 名無しさん

探すだけじゃなくて、置きかえたいときは

22: 名無しさん

>>21
sed を使う。sed 's/colour/color/g' file.txt で、各行の colour をすべて color にして出力する
sed -E で ERE になるのは grep と同じ

23: 名無しさん

>>6
IPアドレスっぽい行を探すのも、同じ考え方?

24: 名無しさん

>>23
grep -E '([0-9]{1,3}\.){3}[0-9]{1,3}' file.txt で、「数字1〜3桁とドット」を3回くり返して、最後に数字1〜3桁、を探せる
. は任意の1文字やから、ドットそのものは \. と書く。この式は にも当たるから、形だけで見るおおまかな絞り込み

25: 名無しさん

+ が効かんときは -E、行全体なら ^ と $、ドットそのものは \.、やな

管理人のひとこと