3〜4個の数字を見つける正規表現

3〜4個の数字を見つける正規表現

それで、50以上の単語があり、その中にある数字を一致させなければなりません。この数字は3桁または4桁です。すべてを試しましたが、何も機能しないようです(この数字をパターンとして覚えておく必要があります)。私の試み:

'/\(.*\)\([0-9][0-9]?[0-9][0-9]\)\(.*\)/'
'/\(.*\)\([0-9]\{3,4\}\)\(.*\)/'
'/\(.*\)\(([0-9][0-9][0-9][0-9]|[0-9][0-9][0-9])\)\(.*\)/'
...

常に3つの数字または完全な単語のみが一致します。

入力する:

1844-PAL.Bak 
IMG_1959.bak  
ZER_1940.BAK  
PEN225.bak
word-1943.BAK

覚えておくべきパターン:

1844
1959
1940
225
1943

答え1

これを行う方法はいくつかあります。次のコマンドは、各入力行に1つの数字しか持たないと仮定します。このファイルをテストとして使用しています。

1844-PAL.Bak 
IMG_1959.bak  
ZER_1940.BAK  
PEN225.bak
word-1943.BAK
  1. sed

    $ sed -r 's/([^0-9]*)([0-9]*)([^0-9]*)/1:"\1", 2:"\2", 3:"\3"/' file
    1:"", 2:"1844", 3:"-PAL.Bak "
    1:"IMG_", 2:"1959", 3:"bak  "
    1:"ZER_", 2:"1940", 3:"BAK  "
    1:"PEN", 2:"225", 3:"bak"
    1:"word-", 2:"1943", 3:"BAK"
    
  2. perl

    $ perl -lpe 's/([^\d]*)(\d*)([^\d])/1:"$1", 2:"$2", 3:"$3"/' file
    1:"", 2:"1844", 3:"-"PAL.Bak 
    1:"IMG_", 2:"1959", 3:"."bak  
    1:"ZER_", 2:"1940", 3:"."BAK  
    1:"PEN", 2:"225", 3:"."bak
    1:"word-", 2:"1943", 3:"."BAK
    
  3. grep

    $ grep -oP '\d+' file
    1844
    1959
    1940
    225
    1943
    

1行に1つの関心パターンしかない場合は、次のように単純化できます。

 $ sed -r 's/[^0-9]*([0-9]*).*/Matched: \1/' file
Matched: 1844
Matched: 1959
Matched: 1940
Matched: 225
Matched: 1943

または

$ perl -lpe 's/.*?(\d+).*/Matched $1/' file
Matched 1844
Matched 1959
Matched 1940
Matched 225
Matched 1943

通常、正規表現の場合は少ないほど良いです。常に必要な最も単純な正規表現を使用するように努力する必要があります。数値以外の文字をキャプチャまたは一致させない場合は、正規表現からその文字を除外してください。

答え2

次のGNUgrepコマンドを試してください。

grep -oP '[0-9]{3,4}' file

答え3

sed -e "s/^[^0-9]*//g" -e "s/\(^[0-9]*\)\(.*\)/\1/" <file_name>

これを行う別の方法

sed 's/[^0-9]*//g' <file_name>

関連情報