如何使用groovy脚本查找和替换字符串

问题描述

我需要从文件搜索一些文本并使用 Groovy 脚本替换为其他字符串。我在下面解释我的文件

test.yml:

devices:
  test-server:
    type: test1
    os: test
    tacacs:
      username: admin
    passwords:
      tacacs: admin
    connections:
      defaults:
        class: unicon.Unicon
      cli:
        protocol: ssh
        ip: 1.1.1.1
        port: 2024
      rest:
        protocol: http
        ip: 1.1.1.1
        port: 8080
        username: admin
        password: admin
  RFS1:
    type: test
    os: test
    tacacs:
      username: admin
    passwords:
      tacacs: admin
    connections:
      defaults:
        class: unicon.Unicon
      cli:
        protocol: ssh
        ip: 1.1.1.1
        port: 2024
      rest:
        protocol: http
        ip: 4.4.4.4
        port: 8080
        username: admin
        password: admin
  RFS2:
    type: test
    os: test
    tacacs:
      username: admin
    passwords:
      tacacs: admin
    connections:
      defaults:
        class: unicon.Unicon
      cli:
        protocol: ssh
        ip: 1.1.1.1
        port: 2024
      rest:
        protocol: http
        ip: 6.6.6.6
        port: 8080
        username: admin
        password: admin

在这里,我需要使用 groovy 脚本搜索 IP 下的 devices:/test-server:/connections:/cli:/ip: 1.1.1.1,其中包含一些新字符,例如 ip:10.10.10.10。我正在使用以下代码

def myFile = new File("test.yml") 
def fileText = myFile.text
fileText = (fileText =~ /ip:1.1.1.1/).replaceFirst("ip:10.10.10.10")
myFile.write(fileText)

这里我的问题是在整个文件中替换所需的字符串,其中 ip:1.1.1.1 存在但我需要在 devices:/test-server:/connections:/cli:/ip: 1.1.1.1 下替换。请帮我解决这个问题。

解决方法

执行此操作的更好方法是简单地进行 YAML 解析、操作对象并保存回文件。

以下是使用 Jackson 的示例:

@Grab(group='com.fasterxml.jackson.dataformat',module='jackson-dataformat-yaml',version='2.12.2')

def myFile = new File("test.yml")
def om = new com.fasterxml.jackson.databind.ObjectMapper(
             new com.fasterxml.jackson.dataformat.yaml.YAMLFactory());
def value = om.readValue(myFile,Map)
value['devices']['test-server']['connections']['cli']['ip'] = '10.10.10.10'

它替换了内存对象中的值。然后,您可以将其保存回文件,例如:

om.writeValue(myFile,value)