我是FAKE的新手,并尝试在FAKE中实现一些内容,如下所述:
我有一个超过100行的文件,我想在代码中更改几行,假设我想更改第二行,即IFR.SIIC._0.12
到
IFR.SIIC._0.45
我将如何做到这一点。 我会使用ReplaceInFile或RegexReplaceInFileWithEncoding吗?
答案 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
)
如果您想以正则表达式的形式指定搜索和替换字符串,那么您需要RegexReplaceInFileWithEncoding
或RegexReplaceInFilesWithEncoding
(请注意复数:前者需要单个文件而后者需要多个文件)。我将向您展示多文件版本的示例:
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
。
您想要使用的其中一个取决于您拥有的文件数量,以及您需要多少个不同的替换字符串(以及将它们写为正则表达式有多难)。