在我的文件AppMacros.h
中,我有一行#define TARGET_DEVICE XXX
。 XXX
稍后会更改,因此我想查找以#define TARGET_DEVICE
字符串开头的行,并将其替换为#define TARGET_DEVICE YYY
等特定字符串。
任何人都知道如何在Groovy中制作它?
答案 0 :(得分:2)
这里只是一个示例 - 不知道您是否需要更高级的东西:
def txt = '''
#define TARGET_DEVICE XXX
lol
#define TARGET_DEVICE XXX
olo
#define TARGET_DEVICE XXX
'''
def replaced = txt.split('\n').collect { l ->
def targetLine = l.toLowerCase().startsWith('#define target_device')
targetLine ? '#define TARGET_DEVICE YYY' : l
}.join('\n')
println replaced
答案 1 :(得分:1)
我假设您从命令行传递文件名(如果您知道的话,这可以作为sed -i~
)并且代码创建一个输出文件(同名,但后缀为~
):
def pattern = /^\s*(#define\s+TARGET_DEVICE)\s+.*/
def ls = System.getProperty("line.separator")
def newDevice = "XXX"
File fin = new File(args[0]);
File fout = new File("${fin.name}~")
if( fin.exists() && !fin.isDirectory() )
{
fin.eachLine { line ->
line = line.replaceAll(pattern) {
entireMatch, prefix ->
"${prefix} ${newDevice}"
}
fout.append("${line}${ls}")
//or println line
//or linesAccumulator << line
}
} else {
println "File ${args[0]} not exists or is a directory"
System.exit 5
}
NB :这也适用于非常大的文件导致逐行处理文件。使用的正则表达式放宽了空间约束(如果一条线有多个空格或制表符,它仍然与行匹配)。