123-4567 みたいな番号が書いてある行を探したくて grep '[0-9]+-[0-9]+' file.txt と打った
1行も出てこん
【疑問】grep で「数字3桁-数字4桁」を探したいのに + が効かん。基本と拡張の正規表現【LPICレベル1】
>>1
grep はそのままだと、基本正規表現(BRE)として読む。BRE では + はただの文字grep -E(拡張正規表現、ERE)にすると、+ が「直前のものの1回以上のくり返し」になる
>>2grep -E '[0-9]+-[0-9]+' file.txt やな
>>3
それで出る。桁数まで決めたいなら、{} で回数を指定するgrep -E '[0-9]{3}-[0-9]{4}' file.txt[0-9]{3} に当てはまる文字列は、 から までの 通り
>>4
それやと 9123-45678 みたいな行にも当たるやろ
>>5
当たる。grep は、行の一部にでも当てはまればその行を出す
行全体をその形にしたいなら、行頭の ^ と行末の $ でしばる。grep -E '^[0-9]{3}-[0-9]{4}$' file.txt
基本正規表現のままで、同じことはできんの
>>7
できる。BRE では、バックスラッシュをつけた \{ \} が回数の指定になるgrep '^[0-9]\{3\}-[0-9]\{4\}$' file.txt
GNU の grep なら、BRE でも \+ が1回以上の意味で使える
>>8
BRE と ERE の違いをまとめてほしい
>>9
ERE ではそのまま特別な意味になる + ? | ( ) { } が、BRE ではバックスラッシュをつけたときだけ特別になる. * [ ] ^ $ は、どっちでも最初から特別egrep は grep -E、fgrep は grep -F(正規表現を使わず、文字列そのものを探す)と同じ
. と * の意味がいまいち分からん
>>11. は改行以外の任意の1文字、* は直前の文字の0回以上のくり返しa.c は abc にも a-c にも当たる。ab*c は ac、abc、abbc に当たる.* で「何でもいいから0文字以上」
>>12
シェルの * と同じやと思ってた
>>13
別物。シェルの *.txt の * は「任意の文字列」(ファイル名の展開)で、正規表現の * は「直前の文字のくり返し」
正規表現をクォートで囲まずに書くと、grep に渡る前にシェルがファイル名として展開してしまうことがある。正規表現はシングルクォートで囲む
よく使うオプションは?
>>15-i 大文字と小文字を区別しない、-v 当てはまらない行を出す、-n 行番号をつける、-c 当てはまった行の数、-r ディレクトリの中を再帰的に探すgrep -v '^#' app.conf で、コメント行を除いた設定だけ見られる
>>16
空行も消したいときは?
>>17
空行は「行頭のすぐ後ろが行末」やから ^$grep -v -e '^#' -e '^$' app.conf で、コメント行と空行の両方を除ける
[^0-9] の ^ は、行頭の意味じゃないん?
>>19[ ] の中の先頭に置いた ^ は「それ以外」の意味。[^0-9] は数字以外の1文字[ ] の外の ^ が行頭。同じ記号でも、置く場所で意味が変わる
探すだけじゃなくて、置きかえたいときは
>>21
sed を使う。sed 's/colour/color/g' file.txt で、各行の colour をすべて color にして出力するsed -E で ERE になるのは grep と同じ
>>6
IPアドレスっぽい行を探すのも、同じ考え方?
>>23grep -E '([0-9]{1,3}\.){3}[0-9]{1,3}' file.txt で、「数字1〜3桁とドット」を3回くり返して、最後に数字1〜3桁、を探せる. は任意の1文字やから、ドットそのものは \. と書く。この式は にも当たるから、形だけで見るおおまかな絞り込み
+ が効かんときは -E、行全体なら ^ と $、ドットそのものは \.、やな
管理人のひとこと
- grep はそのままだと基本正規表現(BRE)で、
+ ? | ( ) { }はバックスラッシュをつけたときだけ特別。grep -E(拡張正規表現)ならそのまま使える。 .は任意の1文字、*は直前の0回以上、{3}は3回、[^0-9]は数字以外。行全体を指定するなら^と$でしばる。- シェルの
*と正規表現の*は別物なので、正規表現はシングルクォートで囲む。ドットそのものは\.。 -i-v-n-c-rがよく使うオプション。fgrepはgrep -F、置きかえはsed 's/前/後/g'。