替换文件中的标记时的Groovy正则表达式

时间:2014-08-11 14:44:45

标签: regex string replace groovy

我有一个文本文件,标记“%%#%”位于其中的所有位置。我正在尝试编写一个快速而又脏的Groovy shell脚本,用“%%#%”美元符号替换所有“$”实例。

到目前为止,我有:

#!/usr/bin/env groovy
File f = new File('path/to/my/file.txt')
f.withWriter{ it << f.text.replace("%%#%", "$") }

但是当我运行这个脚本时,没有任何反应(没有例外没有字符串替换)。我想知道我正在搜索的任何字符,或者美元符号本身是否被引擎盖下的正则表达式引擎解释为特殊字符。无论如何,我哪里出错?

1 个答案:

答案 0 :(得分:4)

我必须先读取文件内容,然后写入文件。似乎withWriter会删除文件内容:

def f = new File('/tmp/file.txt')
text = f.text
f.withWriter { w ->
  w << text.replaceAll("(?s)%%#%", /\$/)
}

如果文件太大,您可能想要per line read。否则,您可以使用multiline (?s) regex

注意我已转义$,因为replacereplaceAll的行为不同,因为replace接受char,因此不会受到影响通过正则表达式字符串,而replaceAll将需要转义。

这是我的测试:

$ echo "%%#%
aaaa
bbbb
cccc%%#%dddd" > file.txt && groovy Subst.groovy && cat file.txt 
$
aaaa
bbbb
cccc$dddd