38

您好,我正在使用 groovy 2.1.5,我必须编写一个代码来显示具有给定路径的目录的内容/文件,然后它会备份文件并替换文件中的单词/字符串。这是我用来尝试替换所选文件中的单词的代码

String contents = new File( '/geretd/resume.txt' ).getText( 'UTF-8' ) 
contents = contents.replaceAll( 'visa', 'viva' )

如果有人想以更有效的方式对其进行修改,这也是我的完整代码,我将不胜感激,因为我正在学习。

def dir = new File('/geretd')
dir.eachFile { 
    if (it.isFile()) {
        println it.canonicalPath
    }
}

copy = { File src,File dest-> 

    def input = src.newDataInputStream()
    def output = dest.newDataOutputStream()

    output << input 

    input.close()
    output.close()
}

//File srcFile  = new File(args[0])
//File destFile = new File(args[1])

File srcFile  = new File('/geretd/resume.txt')
File destFile = new File('/geretd/resumebak.txt')
copy(srcFile,destFile)

x = " "
println x

def dire = new File('/geretd')
dir.eachFile { 
    if (it.isFile()) {
        println it.canonicalPath
    }
}

String contents = new File( '/geretd/resume.txt' ).getText( 'UTF-8' ) 
contents = contents.replaceAll( 'visa', 'viva' )
4

6 回答 6

38

作为将整个文件加载到内存中的替代方法,您可以依次执行每一行

new File( 'destination.txt' ).withWriter { w ->
  new File( 'source.txt' ).eachLine { line ->
    w << line.replaceAll( 'World', 'World!!!' ) + System.getProperty("line.separator")
  }
}

当然,这(以及dmahapatro 的回答)取决于您要替换的单词,而不是跨行

于 2013-07-01T11:09:25.110 回答
32

与几乎所有 Groovy 一样,AntBuilder 是最简单的方法:

ant.replace(file: "myFile", token: "NEEDLE", value: "replacement")
于 2015-04-01T14:15:20.550 回答
25

我使用此代码直接在某个文件中将端口 8080 替换为 ${port.http}:

    def file = new File('deploy/tomcat/conf/server.xml')
    def newConfig = file.text.replace('8080', '${port.http}')
    file.text = newConfig

第一个字符串将文件的一行读入变量。第二个字符串执行替换。第三个字符串将变量写入文件。

于 2017-03-15T12:27:34.003 回答
15

使用“文件”对象的答案既好又快,但通常会导致以下错误,当然可以避免这种错误,但会降低安全性:

不允许脚本使用新的 java.io.File java.lang.String。管理员可以决定是批准还是拒绝此签名。

该解决方案避免了上述所有问题:

String filenew = readFile('dir/myfile.yml').replaceAll('xxx','YYY')
writeFile file:'dir/myfile2.yml', text: filenew
于 2018-10-19T13:26:54.367 回答
11

请参阅替换模式的此答案。可以使用相同的原理来替换字符串。

样本

def copyAndReplaceText(source, dest, Closure replaceText){
    dest.write(replaceText(source.text))
}

def source = new File('source.txt') //Hello World
def dest = new File('dest.txt') //blank

copyAndReplaceText(source, dest) {
    it.replaceAll('World', 'World!!!!!')
}

assert 'Hello World' == source.text
assert 'Hello World!!!!!' == dest.text
于 2013-07-01T00:20:05.483 回答
4

其他简单的解决方案是关闭:

def replace = { File source, String toSearch, String replacement ->
        source.write(source.text.replaceAll(toSearch, replacement))
    }
于 2017-05-23T15:16:17.067 回答