【问题标题】:Groovy regex when replacing tokens in file替换文件中的标记时的 Groovy 正则表达式
【发布时间】:2014-10-04 10:39:41
【问题描述】:

我有一个文本文件,其内部到处都有标记“%%#%”。我正在尝试编写一个快速而简单的 Groovy shell 脚本,用美元符号“$”替换所有“%%#%”实例。

到目前为止我有:

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

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

【问题讨论】:

  • Groovy 字符串似乎没有.replace 方法,只有.replaceAll.replaceFirst
  • 试试 '$' 而不是 "$"..
  • 如果这是您的脚本所要做的全部,还可以考虑使用 sed sed -ie 's/%%#%/$/g' path/to/my/file.txt
  • 我不确定文件输入,但在这里使用replaceAll,.replaceAll('%%#%', Matcher.quoteReplacement('$'))

标签: regex string replace groovy


【解决方案1】:

我必须先读取文件内容,然后再写入文件。好像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

【讨论】:

  • 然后写在文件上是什么意思?代码是什么?
  • 读取文件内容:f.text。写在文件上:f.withWriter { ... }
猜你喜欢
  • 2013-05-29
  • 1970-01-01
  • 2012-09-12
  • 2013-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-19
  • 1970-01-01
相关资源
最近更新 更多