替换给定文件中的文本 - FAKE F#MAKE

时间:2017-03-16 09:12:32

标签: f# f#-fake

我是FAKE的新手,并尝试在FAKE中实现一些内容,如下所述: 我有一个超过100行的文件,我想在代码中更改几行,假设我想更改第二行,即IFR.SIIC._0.12IFR.SIIC._0.45

我将如何做到这一点。 我会使用ReplaceInFile或RegexReplaceInFileWithEncoding吗?

1 个答案:

答案 0 :(得分:3)

有许多功能可以帮助您:您选择的功能取决于您更喜欢编写代码的方式。例如,ReplaceInFile希望您为其提供函数,而RegexReplaceInFileWithEncoding希望您为其提供正则表达式(以字符串形式,不是Regex对象)。根据您要替换的文本,可能比另一个更容易。例如,您可以使用ReplaceInFile,如下所示:

Target "ChangeText" (fun _ ->
    "D:\Files\new\oneFile.txt"  // Note *no* !! operator to change a single file
    |> ReplaceInFile (fun input ->
        match input with
        | "IFR.SIIC._0.12" -> "IFR.SIIC._0.45"
        | "another string" -> "its replacement"
        | s -> s // Anything else gets returned unchanged
    )
)

例如,如果您只有一个单个文件中有一组要匹配的特定字符串,那将非常有用。但是,有一个更简单的函数ReplaceInFiles(注意复数),它允许您一次替换多个文件中的文本。此外,ReplaceInFiles不是将函数作为参数,而是采用(old,new)对的序列。这通常更容易编写:

let stringsToReplace = [
    ("IFR.SIIC._0.12", "IFR.SIIC._0.45") ;
    ("another string", "its replacement")
]
Target "ChangeText" (fun _ ->
    !! "D:\Files\new\*.txt"
    |> ReplaceInFiles stringsToReplace
)

如果您想以正则表达式的形式指定搜索和替换字符串,那么您需要RegexReplaceInFileWithEncodingRegexReplaceInFilesWithEncoding(请注意复数:前者需要单个文件而后者需要多个文件)。我将向您展示多文件版本的示例:

Target "ChangeText" (fun _ ->
    !! "D:\Files\new\*.txt"
    |> RegexReplaceInFilesWithEncoding @"(?<part1>\w+)\.(?<part2>\w+)\._0\.12"
                                       @"${part1}.${part2}._0.45"
                                       System.Text.Encoding.UTF8
)

这样您就可以将IFR.SIIC._0.12更改为IFR.SIIC._0.45,将ABC.WXYZ._0.12更改为ABC.WXYZ._0.45

您想要使用的其中一个取决于您拥有的文件数量,以及您需要多少个不同的替换字符串(以及将它们写为正则表达式有多难)。