学习带挑战的Powershell:
我正在Powershell-ISE中(在windows服务器上)做一个GUI,以避免一直输入命令。目标是根据我从unix服务器接收到的加密文件显示一些信息。
到目前为止,我能够在一个巨大的标签框中显示这些文件的内容,但是我很难解析它。
稍后,我需要将输出格式化为一个更具可读性的表,而不是一行,但是由于我已经在处理解析,所以我将其保存在另一篇文章中。
我想这与我读过的关于“简单”字符串提取或-match和$matches上的官方文档的其他文章略有不同。如果我使用regex模式,我总是得到整条线或者什么都没有(模式很难定义,因为在目标之前和之后有很多单词)。
此外,当我使用在帖子中发现的类似代码时,在纯字符串上总是更容易使用,但在这里,我的变量包含输入($Myinput),可能在我试图捕获的一些值的末尾带有\n这样的隐藏字符(文件来自unix,在那里,cat命令用新行正确地显示它。不,我可能不会在unix服务器上执行这个脚本,我只能使用带有基本powershell组件的windows服务器)。
总之,我被困在帖子之间有点太简单,而其他的帖子太高级,我无法理解。
如果你能帮我解开我的逻辑障碍,我将不胜感激,我将在下面重新发布与进展。
A.变量包含如下内容:
这个文件包含两个人的名字: Group1创建日期:23-2010年7月-2010年: word : word自:清华1月01:00:00 CET 2004,直到: Mon 1月01 :59:59 CET 2011 word *:来自:2010年CET 02 :00:00至: Wed Jan 01 00:59:59 CET 2011 * word.word创建日期: 30 -6月-2020年单词名称: word from: Tue Jun 30 11:14:33 CEST 2010CEST 2021 *
注意:它就像一棵树,上面有一组树,下面是人。一个团体或一个人是一个条目。
注意:我需要捕捉每个条目的名字和日期。
B.我所尝试的(不是所有的审判都会太长):
我只知道人数和名字,最后我还需要“从”和“直到”。
目前,我按类型将它们都保存在数组中,但我认为用"people“(?)
#I take the number of people
$people = ([regex]::matches($Myinput,"\d+") | %{$_.value})
$labelOutputBox.AppendText("Number of entries: " + $people[0])
#result not optimized as I get all the digits from that input, and display only the first occurence
#method1 for names
([regex]::matches($Myinput,"First name:\s(?<FirstNames>.*)\sCreation date") | %{$_.value})
$labelOutputBox.AppendText("1/ FirstNames: ")
$labelOutputBox.AppendText($matches['FirstNames'])
# result empty
#method2 for names
$SearchStart="First name: "
$SearchEnd="Creation"
$Myinput -match "(?s)$SearchStart(?<content>.*)$SearchEnd"
$result=$matches['content']
$labelOutputBox.AppendText("2/ FirstNames: ")
$labelOutputBox.AppendText($result)
#result empty, this is where I think a hidden character before the $SearchEnd注意:我也不理解$matches数组,在使用时,我如何显示几个“名字”,因为我不能索引它,我也尝试过,也没有.
我试得越多,我就越困惑。
我也试着把问题分解成更小的问题来简化这个过程,但是它并不能反映真实的事情,有时会有不同的行为。
我的逻辑怎么了?搜索模式呢?
我应该重新考虑一下我对待这件事的方式吗?我的意思是,如果我从另一个角度来看待问题,由人们和先行者.然后,我被太多的结果困在同一个人/名字中--例如,对于下一个人来说,结果是一样的。
很抱歉,如果这有点长,但如你所见,把它分开,把大图弄松。
提前谢谢你。欢迎任何评论。
发布于 2020-08-12 14:04:28
有关您正在使用的一些技术的一些基本信息:
(?<Name>something)用于创建命名捕获组。在这里,捕获组名称是Name,它应用于匹配的something。对于访问每个捕获组匹配的[regex]::Matches('something','(?<MyName>something)').Groups | Where Name -eq 'MyName' | Foreach-Object { $_.Value }
[regex]::Matches()时,如果找到匹配项,则将返回Match对象的集合。可以使用以0开头的索引来访问每个对象,例如,第一个对象的[regex]::Matches()[0]或第四个Match对象的[regex]::Matches()[3]返回一个Match对象的集合。它将只返回发现的第一次匹配,同时考虑到所有捕获组。因此,如果有两个捕获组,它将返回捕获组0、1和2 (0是整个匹配)。例如,[regex]::Match('111112111121112','1(2)')只匹配12 (捕获组0)和2 (捕获组1)一次生成一个Match对象。objects. [regex]::Matches将返回3 Match
Match对象-> Groups -> Name,Value。因此,这意味着您必须对Groups.$matches对象进行迭代,然后在Match 上迭代一个自动变量。当对单个字符串使用-match 运算符并找到一个成功的匹配时,将对其进行更新。然后,您可以检索$matches、$matches.capturegroup等。如果没有找到匹配项,则它将保留其当前值,也就是说,如果没有匹配项是任何字符的贪婪匹配,则不会更新该值。.*?是任何字符的懒惰(非贪婪)匹配。总之,贪婪的匹配将继续尽可能长的匹配。懒惰匹配将尽快停止匹配。'11121112' -match '\d*2'将与11121112匹配,而'11121112' -match '\d*?2'将匹配1112当对单个字符串使用时,
-match 返回 True 或 False 。当对集合使用时,它将返回匹配的项。使用[void]('something' -match 'something')(?s)、'something' -match 'something' | Out-Null或null机制来抑制输出的是一个模式修饰符。语法是(?modifierflag)。s是单线的.修饰符之后的任何匹配项都应用该修饰符。s的优点是.字符将匹配换行符(回车和行提要)。因此,如果字符串中有换行符作为换行符,则如果要跨行进行匹配,则可能需要跨行。对于这些示例中的任何一个,假设$MyInput是一个单独的字符串。
使用[regex]::Matches()**:**的
[regex]::matches($Myinput,'First name:\s(?<FirstNames>.*?)\sCreation date') | Foreach-Object {
($_.Groups | Where Name -eq 'FirstNames').Value # Your capture group values
}使用$matches**:**的
$null = $Myinput -match "(?s)$SearchStart(?<content>.*)$SearchEnd"
# If the above found a match, then the following will contain the content capture group
$matches.contenthttps://stackoverflow.com/questions/63374283
复制相似问题