regex - 在常规中,如何替换特定行上的多次出现?

标签 regex groovy

我有一个 build.properties 文件,例如:

foo=bar/1.1 
start=/data/home/hudson/Project-1.1/workspace/1.1
fred=wilma/workspace/1.1

仅在第 2 行,我想用 2.2 替换所有 1.1,给出:

start=/data/home/hudson/Project-2.2/workspace/2.2

我想出了一种在 groovy 中执行此操作的方法,但我觉得我做错了:

String result = ''
text.eachLine { line ->
  if (line =~ /(?m)start=/)
    result += line.replaceAll('1.1', '2.2') + '\n'
  else
    result += line + '\n'
}

有没有更快捷、更时髦的方法来做到这一点?

最佳答案

如果您的文件在变量 text 中,如下所示:

def text = '''\
foo=bar/1.1 
start=/data/home/hudson/Project-1.1/workspace/1.1
fred=wilma/workspace/1.1'''

或者通过做:

def text = new File( 'props.properties' ).text

然后,一种方法(我相信还有更多方法可以做到这一点)是:

String result = text.readLines().collect {
  it ==~ /^start=.*$/ ? it.replaceAll( '1.1', '1.2' ) : it
}.join( '\n' )

readLines 将文本拆分为一个字符串列表(每行一个),然后您将 collect 到一个新列表中,原始行或替换行(如果它以 start= 开头)。然后,将这个字符串列表与它们之间的 \n 字符重新连接成一个字符串。

希望这是有道理的,这是您想要的吗?

关于regex - 在常规中,如何替换特定行上的多次出现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6792065/

相关文章:

JavaScript RegExp 替换文本

grails - 从插件访问 'grailsApplication'

grails - Groovy/Grails日期类-每月的某天

java - 在 Groovy 中读取流式 JSON

Visual Studio Code 中的 Groovy 格式化程序/美化器

ruby-on-rails - Nokogiri:使用 XPath 搜索 <div>

java - 正则表达式: Matching a string until certain characters

python - 将括号中的所有字符存储在字符串中

java - 正则表达式可选项目

java - Hibernate:根据实体类自动创建/更新数据库表