2017-03-16 23 views
1

我是新來的FAKE,並試圖在FAKE中實現一些東西,如下所述: 我有一個文件有超過100行,我想改變幾行代碼,假設我想要更改第二行,即IFR.SIIC._0.12IFR.SIIC._0.45替換給定文件中的文本 - 假F#製作

我該怎麼做。 我會使用ReplaceInFile或RegexReplaceInFileWithEncoding來做到這一點嗎?

回答

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取對的序列。這往往是比較容易寫:

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.12IFR.SIIC._0.45ABC.WXYZ._0.12ABC.WXYZ._0.45

你希望使用哪一個取決於你有多少文件,以及你需要多少不同的替換字符串(以及將它們寫成正則表達式有多困難)。

+0

非常感謝真棒回答:) – KMittal

+0

嗨rmunn:我想從具有字符串的變量中替換字符串。 或如下所示: @「admintool:RBI.ICISApi.AdminTool _」+ version_no 我收到一個錯誤「綁定中出現意外的引號」 – KMittal

+0

@KMittal - 這可能是F#代碼中某種語法錯誤,所以我如果沒有看到整個功能,將無法回答你的問題。打開一個新問題並再次提問,並確保包含代碼示例。顯示出現錯誤的整個函數,並且不要忘記使用'{}'按鈕正確縮進它。 – rmunn