2017-02-13 100 views
0

我正試圖在PowerShell中的某些.tex文檔上自動化存檔。我想過濾出一些聲明變量的值,如名稱。 這是我在Google上呆了一段時間之後的至今。Powershell:從tex文件中獲取字符串並將它們切割

$FamilyNameLine = Select-String $DocFullFileName -Pattern "\\FamilyName{.*?}" | Select Matches 
$FamilyName = $FamilyNameLine -replace '\\FamilyName{', '' 

我試着用它來獲取家庭的名字,但之後返回

@{Matches=System.Text.RegularExpressions.Match[]} 

我會嘗試切斷最後支架

雖然我還是新的PowerShell的以及正則表達式(我只使用它與grep一點點),感覺就像我失去了一些明顯的東西。

樣本輸入:

\usepackage{grffile} 
\usepackage[utf8]{inputenc} 
\usepackage{tocbibind} 
\usepackage{pdfpages} 
\usepackage{amsmath} 
\usepackage{rotating} 
\FamilyName{Mustermann} 
\cleardoublepage 
\pagenumbering{arabic} 

樣本輸出

echo $FamilyName 
Mustermann 
+0

@melpomene - 編輯 –

回答

0

據我瞭解你的首要問題是這一行:

$FamilyNameLine = Select-String $DocFullFileName -Pattern "\\Surname{.*?}" | Select Matches 

要檢索machting線變化您的代碼爲:

$FamilyNameLine = Select-String $DocFullFileName -Pattern "\\Surname{.*?}" | select -ExpandProperty Line 

這將返回模式匹配的文檔的行。我已使用MatchInfo對象的Line屬性。要檢索有關方法屬性方法的信息,您可以使用Get-Member。例如:

$FamilyNames = @() # Empty array 
$FamilyNameLine | Foreach-Object { $FamilyNames += ($_ -replace '\\FamilyName{', '') } 

希望幫助:

Select-String $DocFullFileName -Pattern "\\Surname{.*?}" | Get-Member 
TypeName: Microsoft.PowerShell.Commands.MatchInfo 

Name   MemberType Definition              
----   ---------- ----------              
Equals  Method  bool Equals(System.Object obj)         
GetHashCode Method  int GetHashCode()             
GetType  Method  type GetType()             
RelativePath Method  string RelativePath(string directory)        
ToString  Method  string ToString(), string ToString(string directory)    
Context  Property Microsoft.PowerShell.Commands.MatchInfoContext  Context {get;set;} 
Filename  Property string Filename {get;}           
IgnoreCase Property bool IgnoreCase {get;set;}          
Line   Property string Line {get;set;}           
LineNumber Property int LineNumber {get;set;}           
Matches  Property System.Text.RegularExpressions.Match[] Matches {get;set;}   
Path   Property string Path {get;set;}           
Pattern  Property string Pattern {get;set;}           

之後,您可以通過更換。

+0

非常感謝! –

0

Select-String返回一個對象,包括但不限於具有匹配對象集合的matches-property。 Select-Object不會提取它的值,但創建一個只有該屬性的對象。你想那個對象轉換爲字符串,這就是爲什麼它輸出對象的字符串定義:

@{Matches=System.Text.RegularExpressions.Match[]} 

這意味着:一個對象,具有相匹配的類型的屬性System.Text.RegularExpressions.Match[]}

嘗試使用-ExpandPropertySelect-String直接獲取匹配對象。

$FamilyNameLine = Select-String -InputObject $s -Pattern "\\FamilyName{.*?}" | Select-Object -ExpandProperty Matches 
$FamilyName = $FamilyNameLine -replace '^\\FamilyName{|}$' 

$FamilyName 

或者你也可以結合線它直接解壓:

$FamilyName = Select-String -InputObject $s -Pattern "\\FamilyName{.*?}" | Foreach-Object { $_.Matches.Value -replace '^\\FamilyName{|}$' } 

$FamilyName 

我修改了替換刪除尾隨}了。

相關問題