【问题标题】:String Manipulation in GroovyGroovy 中的字符串操作
【发布时间】:2020-05-19 23:45:28
【问题描述】:

我正在编写一个 groovy 脚本,它将返回 AWS ECS 服务中的任务定义列表, 这是相同的代码sn-p

def p = 'aws ecs list-task-definitions --family-prefix test'.execute() | 'jq .taskDefinitionArns[]'.execute()
p.waitFor()
print p.text

输出是

"arn:aws:ecs:us-west-2:496712345678:task-definition/test:2"
"arn:aws:ecs:us-west-2:496712345678:task-definition/test:3"

现在我只想捕获结果的最后一部分,即 test:2test:3 等等,不带双引号

我如何使用 Groovy 语言来做到这一点,因为我必须在 Jenkins 的主动选择反应参数插件中使用它

【问题讨论】:

    标签: jenkins groovy amazon-ecs


    【解决方案1】:

    您可以使用/ 进行拆分并获取最后一个元素:

    def p = "arn:aws:ecs:us-west-2:496712345678:task-definition/test:2"
    def result = p.split("/").last()
    

    【讨论】:

    • def p = 'aws ecs list-task-definitions --family-prefix test'.execute() | 'jq .taskDefinitionArns[]'.execute() def result = p.split("/").last() 出现以下错误Caught: groovy.lang.MissingMethodException: No signature of method: java.lang.UNIXProcess.split() is applicable for argument types: (String) values: [/]
    【解决方案2】:

    假设:

    ​def text = "arn:aws:ecs:us-west-2:496712345678:task-definition/test:2" + "\n" + "arn:aws:ecs:us-west-2:496712345678:task-definition/test:3"​​​​​​​​​​​​
    
    

    试试:

    text​.split("\n")​​​​​​​​​​​​​.collect {c -> c.split("/").last()}​​​​​​
    

    这会打印[test:2, test:3]的列表

    如果您希望它在一行中而不是在列表中,请使用:

    text​.split("\n")​​​​​​​​​​​​​.collect {c -> c.split("/").last()}​​​​​.join(",")​
    

    打印:test:2,test:3

    更新

    由于 OP 的评论,答案应该是这样的:

    def p = 'aws ecs list-task-definitions --family-prefix test'.execute() | 'jq .taskDefinitionArns[]'.execute()
    p.waitFor()
    def text =  p.text
    println text​.split("\n")​​​​​​​​​​​​​.collect {c -> c.split("/").last()}​​​​​​ 
    

    【讨论】:

    • def p = 'aws ecs list-task-definitions --family-prefix test'.execute() | 'jq .taskDefinitionArns[]'.execute() p.split("\n").collect {c -> c.split("/").last()}.join(",") 但我收到以下错误Caught: groovy.lang.MissingMethodException: No signature of method: java.lang.UNIXProcess.split() is applicable for argument types: (String) values: [ ]
    • 在问题中有 p.waitFor() 和 p.text 来获取文本。将其保存在变量中,然后尝试我在答案中提供的 sn-p
    • 成功了!!!我得到了以下结果 [test:2", test:3"] 但我希望它像 test2 test3 一样在彼此下方
    • 然后使用:text​.split("\n")​​​​​​​​​​​​​.collect {c -> c.split("/").last ()}.join("\n")
    • 嗨,我快到了,我的输出是 test:1" test:2" 只需要去掉最后一个 "
    【解决方案3】:

    只是添加另一个样式:

    String.metaClass.getMyString{-> delegate.substring(delegate.lastIndexOf("/")+1, delegate.length()-1).replace(":", "")}
    println p.text.readLines()*.getMyString().join(" ")
    

    快乐学习...! :)

    【讨论】:

    • 是的,它适用于普通的 groovy 脚本,但不适用于 Jenkins UI
    猜你喜欢
    • 1970-01-01
    • 2011-05-12
    • 1970-01-01
    • 2012-07-16
    • 1970-01-01
    • 2010-11-10
    相关资源
    最近更新 更多