Powershell:将Strings从tex文件中删除并切割它们

时间:2017-02-13 12:48:56

标签: regex powershell

我正在尝试在Powershell中自动归档一些.tex文档。我想过滤掉一些声明的变量的值,比如名称。 这是我在Google上花了一些时间后到目前为止所做的事情。

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

我尝试使用它来获取姓氏,但它返回

@{Matches=System.Text.RegularExpressions.Match[]}
之后我会尝试切断最后一个支架

虽然我仍然是Powershell和RegEx的新手(我只使用grep一点),感觉我错过了一些明显的东西。

示例输入:

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

示例输出

echo $FamilyName
Mustermann

2 个答案:

答案 0 :(得分:0)

据我所知,你的主要问题是这一行:

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

要检索加工线,请将代码更改为:

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

这将返回模式匹配的文档行。我使用了Line对象的MatchInfo属性。要检索有关方法的属性方法的信息,可以使用Get-Member。例如:

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;}                                        

之后您可以通过以下方式替换:

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

希望有所帮助。

答案 1 :(得分:0)

Select-String返回一个对象,包括但不限于具有match-objects集合的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

我修改了你的替换以删除尾随的}