Alrighty ..
所以我正在编辑一个AutoIt脚本,里面有很多未使用的函数。原作者认为适合添加他/她的包含文件中的所有功能。
起初我尝试使用AutoIt / SciTe中的工具来删除未使用的函数,但是由于一些奇怪的原因,这使得脚本/编译文件无用。所以现在我认为最好写一个函数移除器。
这是我到目前为止所拥有的: 搜索具有“Func _”的行计数该函数出现在文件中的次数。如果是1次,则选择字符串
$FileName=".\FILENAME.au3"
$File=Get-Content $FileName
$Funcs=$File|Select-String "Func _"
foreach ($Func in $Funcs) {
$FuncName=$Func.ToString().Split('( ')[1]
$Count=($File|Select-String $FuncName | Measure-Object).Count
if ($count -eq 1) {
$File|Select-String "Func _" $FuncName
}
}
我想要做的是删除该功能,可能是正则表达式。所以类似于: 删除“Func _”$ func *“EndFunc”
问题在于,这是一个跨越多行的搜索,从Func _NAMEOFFUCTION到EndFunc。我不清楚PowerShell中的正则表达式是否可以做到这一点。并非所有正则表达式实现似乎都能跨越线条进行搜索。正则表达式甚至是答案吗?我不知道。
答案 0 :(得分:1)
在PowerShell 1.0或2.0中使用Get-Content时,您只能返回一个字符串数组 - 每行一个。当您需要正则表达式跨越多行时,这不起作用。使用此方法将文件作为单个字符串读取:
$FileContent = [io.file]::ReadAllText($FileName)
如果您使用的是PowerShell V3,则可以使用-Raw
参数将文件作为单个字符串读取:
$FileContent = Get-Content $FileName -Raw
然后,当您使用Select-String时,您需要修改正则表达式以启用单行s
(可能还有多行m
)模式,例如:
$FileContent | Select-String "(?smi)$FuncName" -AllMatches
注意i
是不区分大小写的。使用-AllMatches
参数匹配文件中的多个函数定义。
答案 1 :(得分:0)
这是一个应该与AutoIt函数定义匹配的正则表达式。它假设Func
和EndFunc
关键字始终位于行的开头,并且它们区分大小写。函数名称在名为FuncName
的组中捕获(在C#中,您将通过组[“FuncName”]访问它;)
"(?m)^Func\s+\b(?<FuncName>_\w+\b).*\n(?:(?!EndFunc\b).*\n)*EndFunc.*\n?"
仅对于功能名称,您可以使用"\b_\w+\b"
或"\b_[A-Za-z]+\b"
;我不知道你需要多严格)。对PowerShell几乎没有经验,我可能会使用[regex]::Matches
和[regex]::Replace
来完成这项工作。我不知道PS是否提供了更好的方式。
我假设你已经将整个文件读成@Keith建议的字符串,而不是像你原来那样逐行。