2017-05-17 10 views
0

最後にregexesを含むIPアドレスを持つファイルがあります。 例えば:などsedの正規表現の範囲を広げる

111.111.11.[2-5] 
111.11.11.[2,3,7] 

そして、これらは、IPアドレスが111.111.11.2の範囲にあることができることを意味し、111.111.11.3、

私はそれらの正規表現をそのファイルを取得し、拡大できるようにする必要があります各オプションについて私はこれの意味することは111.111.11を与えられている[2-5]、私はそれにスクリプトを実行すると、次のような結果になるだろう:私は、このような場合にはPythonのとなるだろう

111.111.11.2 
111.111.11.3 
111.111.11.4 
111.111.11.5 
+0

あなたは何を試してみましたか? StackOverflowは、人々がプログラミングコードを修正する手助けをしています。チュートリアル、リサーチ、ツール、推奨事項、図書館、およびコードのリクエストは、話題にはなりません。 *** ***を読んでくださいhttp://stackoverflow.com/help/how-to-ask、http://stackoverflow.com/help/dont-ask、http://stackoverflow.com/help/mcveとここでQを投稿する前に[ツアー](http://stackoverflow.com/tour)に行ってください。がんばろう。 – shellter

+0

私はsedとawkを試しました。私は最初の3オクテットをつかみ、それを変数に格納してから範囲を取得し、forループで使用しようとしていました。私が遭遇した問題は、これらの各範囲または別々の正規表現内の項目の数が可変サイズであるため、そのようなハードコードはできませんでした。 – MichaelJC

答えて

1

を:

expand_ip_range.pyスクリプト:

import sys 
with open(sys.argv[1], 'r') as f: 
    for l in f.read().splitlines(): 
     # extracting the ending part with a range 
     parts = l.rsplit('.', 1) 
     r = parts[1].strip('[]') # getting range relative representation 
     if '-' in r:    # if it's range by hyphen `-` 
      if r.count('-') > 1: 
       raise Exception("Invalid range " + r) 
      else: 
       bounds = r.split('-') # range boundaries 
       for i in range(int(bounds[0]), int(bounds[1])+1): 
        print("%s.%s" % (parts[0], i)) 
     elif ',' in r:    # if it's range by comma `,` 
      items = r.split(',') 
      for i in items: 
       print("%s.%s" % (parts[0], i)) 

使い方Pythonの 3でテスト):

python3 expand_ip_range.py yourfile 

出力:

111.111.11.2 
111.111.11.3 
111.111.11.4 
111.111.11.5 
111.11.11.2 
111.11.11.3 
111.11.11.7 
+0

これは多くの役に立ちます!しかし、ここでは2つの正規表現だけを例に挙げています。 111.11.111 [2 | 88]のようなIPの最後には、任意の数の正規表現が存在する可能性があります。すべての可能性の中で私ができることは、ipsの最後に正規表現のバリエーションがあることを意味する – MichaelJC