I have a variable holding the following text:
blablablabla
blablablabla
blablablabla
messages: 30
name: muzi
blablablabla
blablablabla
blablablabla
messages: 20
name: puzi
blablablabla
blablablabla
blablablabla
.
.
.
What i want to do is to grep the name and messages (every time the messages is related to the name that comes up right after him)
and set it up in data (switch name and messages) for example key value pair so i would have
Data = [
"muzi": 30
"puzi": 20
]
And so one. This is something that i can easily do in powershell but i have no experience in groovy and id love if someone can offer me some help.
CodePudding user response:
def lines='''
blablablabla
blablablabla
blablablabla
messages: 30
name: muzi
blablablabla
blablablabla
blablablabla
messages: 20
name: puzi
blablablabla
blablablabla
blablablabla
messages: 11
name: puz
'''.readLines()
//Like this
def messages = lines.findAll{ it=~/^messages:\s / }.collect{ it.split(/:\s /)[1] }
def names = lines.findAll{ it=~/^name:\s / }.collect{ it.split(/:\s /)[1] }
def res = [names,messages].transpose().collectEntries()
println res
//OR like this:
res = lines.findAll{ it=~/^(messages|name):\s / }.collect{ it.split(/:\s /)[1] }.collate(2).collectEntries{[it[1], it[0]]}
println res
CodePudding user response:
You can use multiline regexp, which enforces that the two lines are consecutive. See the negative data at the beginning of the string.
String txt = """
messages: 300
blablablabla
name: zeny
blablablabla
blablablabla
messages: 30
name: muzi
blablablabla
blablablabla
messages: 20
name: puzi
blablablabla
"""
def res = [:]
txt.findAll(/(?ms)^messages: (\d )$.^name: (\w )$/) {match, w1, w2 -> res[w2] = w1}
assert res == [muzi:'30', puzi:'20']