如何使用 groovy 脚本查找和替换字符串
How to find and replace string using groovy script
我需要从文件中搜索一些文本并使用 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 脚本搜索 devices:/test-server:/connections:/cli:/ip: 1.1.1.1
下的 IP
和一些新字符,例如 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)
我需要从文件中搜索一些文本并使用 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 脚本搜索 devices:/test-server:/connections:/cli:/ip: 1.1.1.1
下的 IP
和一些新字符,例如 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)