2017-03-09 92 views
-4

我有一個文件測試文件,其中包含一組服務器名稱,如下所示。提取方括號內的值

app-server-l11[2-5].test.com 
server-l34[5-8].test.com 
dd-server-l[2-4].test.com 

您可以請幫助獲取輸出如下。

app-server-l112.test.com 
app-server-l113.test.com 
app-server-l114.test.com 
app-server-l115.test.com 
server-l345.test.com 
server-l346.test.com 
server-l347.test.com 
server-l348.test.com 
dd-server-l2.test.com 
dd-server-l3.test.com 
dd-server-l4.test.com 
+0

你有什麼已經嘗試過?你有沒有嘗試過這個問題? – HarryCBurn

+0

我不介意爲OP編寫單行內容,但這比這更復雜一點... –

回答

1

最差和最醜的例子:

var='app-server-l11[2-5].test.com' 
for i in range(int(var[(var.find('[') +1)]), int(var[(var.find("]") - 1)])+1): 
    print 'app-server-l11' + str(i) + '.test.com' 

用你的想象力!

0

不是最好的解決方案,但它的工作原理...

inp = open('input.txt', 'r+').read() 
print(inp) 
result= '' 
for i in inp.split('\n'): 
    if len(i) > 1: 
     print(repr(i)) 
     f1 = i.find('[') 
     f2 = i.find(']')+1 
     b1 = i[:f1] 
     b2 = i[f2:] 
     ins = i[f1:f2] 
     ins = ins[1:-1] 
     for j in range(int(ins.split("-")[0]),int(ins.split("-")[1])+1): 
      result+=b1+str(j)+b2+'\n' 

outp = open('output.txt', 'w') 
outp.write(result) 
outp.close() 
0

由於這聽起來像學校裏的功課我會是相當模糊的。我將使用正則表達式來提取數字範圍和地址組件的其餘部分,然後使用循環遍歷提取的數字範圍來構建每個地址(使用其他捕獲的地址組件)。


因爲它已經過了一週:

import re 

    inputs = [ "app-server-l11[2-5].test.com", "server-l34[5-8].test.com", "dd-server-l[2-4].test.com" ] 

    pattern = r"\s*(?P<subdomain>[a-zA-Z0-9-_.]+)\[(?P<range_start>\d+)-(?P<range_end>\d+)\](?P<domain>\S+)" 

    expr = re.compile(pattern) 

    def expand_domain(domain): 
     mo = expr.match(domain) 
     if mo is not None: 
      groups = mo.groupdict() 
      subdomain = groups[ "subdomain" ] 
      domain = groups[ "domain" ] 
      range_start = int(groups[ "range_start" ]) 
      range_end = int(groups[ "range_end" ]) 
      result = [ "{}{:d}{}".format(subdomain, index, domain) for index in range(range_start, range_end + 1) ] 
      return result 
     else: 
      raise ValueError("'{}' does not match the expected input.".format(domain)) 

    for domain in inputs: 
     print("'{}':".format(domain)) 
     for exp_dom in expand_domain(domain): 
      print("--> {}".format(exp_dom)) 
1
ser_nm = ['app-server-l11[2-5].test.com','server-134[5-8].test.com','dd-server-[2-4].test.com'] 

for nm in ser_nm: 
    for i in range(int(nm[nm.find('[')+1 : nm.find('-',(nm.find('[')+1))]), int(nm[nm.find('-',(nm.find('[')+1))+1:nm.find(']') ])+1): 
     print(nm[:nm.find('[')] + str(i) + nm[nm.find(']')+1:]) 

這也將照顧的情況下,其中服務器名稱是這樣的: 「服務器-134 [52-823]。測試.com」之間

2

隨着GNU AWK的第三ARG匹配():

$ awk 'match($0,/(.*)\[([0-9]+)-([0-9]+)\](.*)/,a){for (i=a[2]; i<=a[3]; i++) print a[1] i a[4]}' file 
app-server-l112.test.com 
app-server-l113.test.com 
app-server-l114.test.com 
app-server-l115.test.com 
server-l345.test.com 
server-l346.test.com 
server-l347.test.com 
server-l348.test.com 
dd-server-l2.test.com 
dd-server-l3.test.com 
dd-server-l4.test.com 
+1

++:這不僅僅是一個答案 - 是一個關於匹配函數的迷你awk教程。 –

1

在GNU AWK:

$ awk -F"[][]" '{split($2,a,"-"); for(i=a[1];i<=a[2];i++) print $1 i $3}' file 
app-server-l112.test.com 
app-server-l113.test.com 
app-server-l114.test.com 
app-server-l115.test.com 
server-l345.test.com 
server-l346.test.com 
server-l347.test.com 
server-l348.test.com 
dd-server-l2.test.com 
dd-server-l3.test.com 
dd-server-l4.test.com 
  • 分裂到字段由[]使用FS
  • 使用split的獲得範圍開始(a[1])和結束(a[2]
  • 迭代與for範圍並輸出

沒有檢查是否有範圍。它可以通過如下方式實現:print (NF==3 ? $1 i $3 : $1)

0

無需任何複雜語句,即可使用以下命令獲取所需的輸出。

awk -f test.awk file.txt 

test.awk必須包含以下行:

{ 
    if(a=match($0,"\\[")) 
    { 
      start=strtonum(substr($0,a+1,1)); 
      end=strtonum(substr($0,a+3,1)); 
      copy=$0; 
      for(i=start;i<=end;i++) 
      { 
        sub("\\[[0-9]{1,}-[0-9]{1,}\\]",i,copy); 
        print copy; 
        copy = $0; 
      } 
    } 
    else 
    { 
      print $0; 
    } 
} 

文件。TXT包含像下面行輸入文件:

app-server-l11[2-5].test.com 
server-l34[5-8].test.com 
dd-server-l[2-4].test.com 

輸出:

app-server-l112.test.com 
app-server-l113.test.com 
app-server-l114.test.com 
app-server-l115.test.com 
server-l345.test.com 
server-l346.test.com 
server-l347.test.com 
server-l348.test.com 
dd-server-l2.test.com 
dd-server-l3.test.com 
dd-server-l4.test.com