查找以特定字符串开头的行并将其替换为新行

时间:2015-10-16 02:24:42

标签: groovy

在我的文件AppMacros.h中,我有一行#define TARGET_DEVICE XXXXXX稍后会更改,因此我想查找以#define TARGET_DEVICE字符串开头的行,并将其替换为#define TARGET_DEVICE YYY等特定字符串。

任何人都知道如何在Groovy中制作它?

2 个答案:

答案 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 :这也适用于非常大的文件导致逐行处理文件。使用的正则表达式放宽了空间约束(如果一条线有多个空格或制表符,它仍然与行匹配)。