我正在尝试在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
答案 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[]}
尝试将-ExpandProperty
与Select-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
我修改了你的替换以删除尾随的}
。