如何使用Groovy将文本文件行添加到具有特定模式的数组中?

cdmah0mi  于 2023-06-28  发布在  其他
关注(0)|答案(2)|浏览(105)

我有一个file.txt,其中包含

##---A1---
a1.la
a2.la
a3.la
##---B1--
b1.la
b3.la
##---C1--
c1.la
c2.la
c3.la
c4.la

我想写一个Groovy脚本,以便更新Array值

Main = [A1 B1 C1]
A1 = [a1.la b1.la c1.la]
B1 = [b1.la b3.la]
C1 = [c1.la c2.la c3.la c4.la]

编辑:需要在Jenkinsfile中实现此功能

nwsw7zdq

nwsw7zdq1#

下面是使用vanilla Groovy的方法

def result = new File('file.txt').text.readLines().inject([result: [:].withDefault { k -> [] }, current: null]) { acc, line ->
    if (line.startsWith('##---')) {
        def token = line.replaceAll('[#-]', '')
        acc.result['Main'] << token
        [result: acc.result, current: token]
    } else if (acc.current) {
        acc.result[acc.current] << line
        acc
    }
}.result

result是一个Map

[
   Main:[A1, B1, C1],
   A1:[a1.la, a2.la, a3.la],
   B1:[b1.la, b3.la],
   C1:[c1.la, c2.la, c3.la, c4.la]
]

不确定Jenkins是否允许上述操作

xienkqul

xienkqul2#

使用这种方法,您可以在一个正则表达式中捕获整个内容,然后聚合结果

import java.util.regex.Matcher

    String test = """\
    ##---A1---
    a1.la
    a2.la
    a3.la
    ##---B1--
    b1.la
    b3.la
    ##---C1--
    c1.la
    c2.la
    c3.la
    c4.la
    """
    Matcher matcher = test =~/(?ms)##---(..)-+\n((?:[^#]+?\n)+)/
    Map result = ['Main' : matcher.collect { all, name, list -> name }]
    matcher.each { all, name, list ->
        result[name] = list.readLines()
    }

通过result.each { println it }打印结果会导致:

Main=[A1, B1, C1]
A1=[a1.la, a2.la, a3.la]
B1=[b1.la, b3.la]
C1=[c1.la, c2.la, c3.la, c4.la]

相关问题