• ベストアンサー

Cygwinの正規表現

こんにちは、いつもお世話になっております。 タイトルの通りなのですが、 連続する0~9の数字が3桁と4桁の行が 入り混じっているテキストに対して、 3桁のもののみをgrepしたいのですが、 上手く行きません。 この場合の正規表現はどのようにすれば 良いでしょうか? ちょっと稚拙かも知れませんが、 1時間ぐらい錯綜しています。 何卒よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.3

---- test.txt ---- aaa998 999bbb aaa000bbb 111 aaa1001 1002bbb aaa1003bbb aaa1004bbb 2222 に対して、 egrep '(^|[^0-9])[0-9]{3}($|[^0-9])' test.txt で aaa998 999bbb aaa000bbb 111 という出力が得られました。これでよろしいでしょうか。

hikaru2005
質問者

お礼

ご回答、有難う御座います。 ご案内頂いたコマンドで、問題は解決致しました。 非常に助かりました。 これで、正確なデータベースが作れます。

その他の回答 (2)

回答No.2

> 「|」とカッコによるグルーピングが使えれば、まとめて1つの正規表現にできます。grepで通用するかどうか分かりませんが egrep なら大丈夫ですよ。

hikaru2005
質問者

補足

補足有難う御座います。 egrepも試してみたのですが、成功しませんでした。 ちょっと弱りました・・・

  • xcrOSgS2wY
  • ベストアンサー率50% (1006/1985)
回答No.1

grepで扱える正規表現のレベルが分からないので最も基本的なものだけ使用しますと、数字が3文字連続するものは [0-9][0-9][0-9] ですね。 このままでは数字4文字以上のものも該当するので、前後に数字が来ないものだけに限定すると [^0-9][0-9][0-9][0-9][^0-9] となります。 これだと数字3文字が行頭や行末にあると困るので、それも含めるには・・・「|」を使って複合条件にすればよいですが、基本的な正規表現だけでやるとすれば、 [^0-9][0-9][0-9][0-9][^0-9] ^[0-9][0-9][0-9][^0-9] [^0-9][0-9][0-9][0-9]$ ^[0-9][0-9][0-9]$ と4回、grepを行うというのも分かりやすくて良いでしょう。それぞれ「行中に数字3桁」、「行頭に数字3桁」、「行末に数字3桁」、「1行に数字3桁のみ」です。 「|」とカッコによるグルーピングが使えれば、まとめて1つの正規表現にできます。grepで通用するかどうか分かりませんが (^|[^0-9])[0-9][0-9][0-9]($|[^0-9]) のような感じ。 [0-9]は\dで代用可能かも。これも正規表現のレベル次第なのですが。

hikaru2005
質問者

補足

ご回答有難う御座います。 しかし、残念ながら 全て試してみたのですが、どれも成功しませんでした。

関連するQ&A