4

個々のフィールドを取得するために解析したい次のテキスト ファイルがあります。

host_group_web = ( )
host_group_lbnorth = ( lba050 lbhou002 lblon003 )

抽出したいフィールドは太字です

  • host_group_ web = ( )
  • ホスト_グループ_ lbnorth = ( lba505 lbhou002 lblon003 )

host_group_web ( )の間にアイテムがないため、その部分は無視されます

最初のグループにnodegroupと名前を付け、 () の間の項目にノードと名前を付けました

ファイルを 1 行ずつ読み取り、さらに処理するために結果を保存しています。

Golang では、これは私が使用している正規表現のスニペットです。

hostGroupLine := "host_group_lbnorth = ( lba050 lbhou002 lblon003 )"
hostGroupExp := regexp.MustCompile(`host_group_(?P<nodegroup>[[:alnum:]]+)\s*=\s*\(\s*(?P<nodes>[[:alnum:]]+\s*)`)
hostGroupMatch := hostGroupExp.FindStringSubmatch(hostGroupLine)

for i, name := range hostGroupExp.SubexpNames() {
  if i != 0 {
    fmt.Println("GroupName:", name, "GroupMatch:", hostGroupMatch[i])
  }
}

次の出力が得られます。これには、group という名前のノードの残りの一致がありません。

GroupName: nodegroup GroupMatch: lbnorth
GroupName: nodes GroupMatch: lba050

Golang Playground のスニペット

私の質問は、ノードグループとライン内のすべてのノードに一致する正規表現を Golang で取得するにはどうすればよいかということです。たとえば、lba050 lbhou002 lblon003 です。ノードの数は、0 からさまざまです。

4

1 に答える 1

5

グループ名と可能なすべてのノード名をキャプチャする場合は、別の正規表現パターンを使用する必要があります。これは、それらすべてを一度にキャプチャする必要があります。名前付きキャプチャ グループを使用する必要はありませんが、必要に応じて使用できます。

hostGroupExp := regexp.MustCompile(`host_group_([[:alnum:]]+)|([[:alnum:]]+) `)

hostGroupLine := "host_group_lbnorth = ( lba050 lbhou002 lblon003 )"
hostGroupMatch := hostGroupExp.FindAllStringSubmatch(hostGroupLine, -1)

fmt.Printf("GroupName: %s\n", hostGroupMatch[0][1])
for i := 1; i < len(hostGroupMatch); i++ {
    fmt.Printf("  Node: %s\n", hostGroupMatch[i][2])
}

プレイグラウンドでの動作をご覧ください

別:

awkが解析を行う方法で作業することもできます。正規表現を使用して行をトークンに分割し、必要なトークンを出力します。もちろん、行のレイアウトはあなたの例で与えられたものと同じでなければなりません。

package main

import (
    "fmt"
    "regexp"
)

func printGroupName(tokens []string) {
    fmt.Printf("GroupName: %s\n", tokens[2])
    for i := 5; i < len(tokens)-1; i++ {
        fmt.Printf("  Node: %s\n", tokens[i])
    }
}

func main() {

    // regexp line splitter (either _ or space)
    r := regexp.MustCompile(`_| `)

    // lines to parse
    hostGroupLines := []string{
        "host_group_lbnorth = ( lba050 lbhou002 lblon003 )",
        "host_group_web = ( web44 web125 )",
        "host_group_web = ( web44 )",
        "host_group_lbnorth = ( )",
    }

    // split lines on regexp splitter and print result
    for _, line := range hostGroupLines {
        hostGroupMatch := r.Split(line, -1)
        printGroupName(hostGroupMatch)
    }

}

プレイグラウンドでの動作をご覧ください

于 2016-11-05T19:18:57.733 に答える