將過濾器添加到 Line 物件的好方法是什么:
$ .Line = $ .Line -replace "^\s procedure\s*", ""
PS> gci -Recurse -Include *.vhd |
sls -Pattern "^\s*procedure" |
sls -NotMatch -Pattern "end" |
Select-Object line, FileName
輸出:
procedure ucm_init( sim_pkg_bus_host.vhd
procedure ucm_reset( sim_pkg_bus_host.vhd
procedure ucm_idle( sim_pkg_bus_host.vhd
procedure ucm_write( sim_pkg_bus_host.vhd
procedure ucm_read( sim_pkg_bus_host.vhd
我想看到的:
PS> gci -Recurse -Include *.vhd |
sls -Pattern "^\s*procedure" |
sls -NotMatch -Pattern "end" |
%{ $_.Line = $_.Line -replace "^\s procedure\s*", "" } |
Select-Object line, FileName |
Sort-Object Line
輸出:
ucm_init( sim_pkg_bus_host.vhd
ucm_idle( sim_pkg_bus_host.vhd
ucm_reset( sim_pkg_bus_host.vhd
ucm_read( sim_pkg_bus_host.vhd
ucm_write( sim_pkg_bus_host.vhd
輸入:sim_pkg_bus_host.vhd
procedure ucm_init(
...
end procedure;
procedure ucm_reset(
...
end procedure;
procedure ucm_idle(
...
end procedure;
procedure ucm_write(
...
end procedure;
procedure ucm_read(
...
end procedure;
uj5u.com熱心網友回復:
就個人而言,我會從匹配項中創建一個物件陣列,例如:
$result = Get-ChildItem -Path 'X:\WhereTheFilesAre' -Filter '*.vhd' -File -Recurse | ForEach-Object {
$content = Get-Content -Path $_.FullName -Raw
# if you don't want the open bracket in the procedure name, use '(?im)^\s*procedure (\w )'
$regex = [regex] '(?im)^\s*procedure (\w \()'
$match = $regex.Match($content)
while ($match.Success) {
[PsCustomObject]@{Procedure = $match.Groups[1].Value; FileName = $_.Name}
$match = $match.NextMatch()
}
} | Sort-Object Procedure
# output on screen
$result
輸出:
Procedure FileName
--------- --------
ucm_idle( sim_pkg_bus_host.vhd
ucm_init( sim_pkg_bus_host.vhd
ucm_read( sim_pkg_bus_host.vhd
ucm_reset( sim_pkg_bus_host.vhd
ucm_write( sim_pkg_bus_host.vhd
有了這個結果,您可以做任何您需要的事情,例如將其寫入 CSV 檔案或格式為您的問題中的行:
$len = ($result.Procedure | Measure-Object -Property Length -Maximum).Maximum
$result | ForEach-Object {
"{0,-$($len 4)}{1}" -f $_.Procedure, $_.FileName
}
輸出:
ucm_idle( sim_pkg_bus_host.vhd
ucm_init( sim_pkg_bus_host.vhd
ucm_read( sim_pkg_bus_host.vhd
ucm_reset( sim_pkg_bus_host.vhd
ucm_write( sim_pkg_bus_host.vhd
uj5u.com熱心網友回復:
使用正則運算式捕獲組( (...)) 僅提取每行上感興趣的子字串,然后您可以通過計算屬性公開這些子字串,該屬性對輸出的實體進行Select-Object操作:Microsoft.PowerShell.Commands.MatchInfoSelect-String
Get-ChildItem -Recurse -Include *.vhd |
Select-String '^\s*procedure (\w )\(' |
Select-Object @{ n='Line'; e={ $_.Matches.Groups[1].Value } }, Filename |
Sort-Object Line
這會產生類似的東西(請注意,我故意排除了(以下程序名稱):
Line Filename
---- --------
ucm_idle sim_pkg_bus_host.vhd
ucm_init sim_pkg_bus_host.vhd
ucm_read sim_pkg_bus_host.vhd
ucm_reset sim_pkg_bus_host.vhd
ucm_write sim_pkg_bus_host.vhd
uj5u.com熱心網友回復:
您可以將“計算的屬性”放在Select-Object.
在您的第一個代碼版本中替換此部分:
Select-Object line, FileName
有了這個:
Select-Object @{ Name='Line'; Expression={ $_.Line -replace "^\s procedure\s*", "" }}, FileName
哈希表告訴Select-Object創建一個名為“Line”的新屬性(但我們可以將其命名為任何名稱,例如“MyLine”),它提供了計算Line' 值的運算式。
uj5u.com熱心網友回復:
$sls = gci -Recurse -Include *.vhd | sls -Pattern "^\s*procedure"
for($i=0; $i -lt $sls.Count; $i ) {
$sls[$i].Line = $sls[$i].Line -replace "^\s*procedure", ""
$sls[$i].Line = $sls[$i].Line -replace "\s*\(.*$", ""
}
$sls |
Select-Object Line, FileName |
Sort-Object Line
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/474180.html
標籤:电源外壳
上一篇:powershell腳本不作業,但沒有顯示錯誤。查找目錄中的所有.xml檔案,對某些文本進行替換,移動到不同的目錄
