我想从包含不同短语的前一行中的特定位置找到一个单词。假设这是我们文件中的文本:
<data name="variable" xml:space="preserve">
<value>key phrase</value>
</data>
所以我知道key phrase
,我想提取variable
。
到目前为止我已经想出了这样的东西
$var= Select-String $DirPath -Pattern 'key phrase' -SimpleMatch -Context 1 |
ForEach-Object { $_.Line.Split(' ')[4] }
我希望-Context 1
能跳回到前一行。虽然我仍然不知道如何从上面的行中提取variable
。Split(' ')
在这里不太好用,因为这个词被引号括起来了。
干杯
2条答案
按热度按时间lkaoscv71#
不知道你的XML看起来是什么样子,但肯定没有必要把它当作一个纯文本文件。
例如,这将返回
variableFoo
和variableBar
,因为这两个value
标记中都有key phrase
。roejwanj2#
Santiago's helpful answer绝对是您问题的最佳解决方案:解析XML的最健壮的方法总是使用专用的解析器。
至于你尝试了什么:
Select-String
的-Context
参数接受一到两个(以 * 数组 * 的形式,即使用,
作为分隔符)数字,指定匹配搜索模式的线 * 周围 * 的线的数量,以及匹配线。Select-String
输出的Microsoft.PowerShell.Commands.MatchInfo
示例的.Context
属性,而Microsoft.PowerShell.Commands.MatchInfo
示例又具有包含前后上下文行的.PreContext
和.PostContext
属性。因此,如果要使用纯文本处理,则必须通过
$_.Context.PreContext[0]
提取name
属性值('variable'
),如以下代码片段所示(请注意,-split '"'
用于将行分割为"
,这意味着第二个([1]
)元素包含感兴趣的值):输出: