powershell 从前面的一行中提取一个特定的词

bd1hkmkf  于 2023-04-12  发布在  Shell
关注(0)|答案(2)|浏览(117)

我想从包含不同短语的前一行中的特定位置找到一个单词。假设这是我们文件中的文本:

<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能跳回到前一行。虽然我仍然不知道如何从上面的行中提取variableSplit(' ')在这里不太好用,因为这个词被引号括起来了。
干杯

lkaoscv7

lkaoscv71#

不知道你的XML看起来是什么样子,但肯定没有必要把它当作一个纯文本文件。
例如,这将返回variableFoovariableBar,因为这两个value标记中都有key phrase

$xml = [xml] @'
<test>
  <data name="variableFoo" xml:space="preserve">
    <value>key phrase</value>
  </data>
  <data name="variableBar" xml:space="preserve">
    <value>key phrase</value>
  </data>
</test>
'@

$xml.SelectNodes('test/data/value[text()="key phrase"]') |
    ForEach-Object { $_.ParentNode.name }
roejwanj

roejwanj2#

Santiago's helpful answer绝对是您问题的最佳解决方案:解析XML的最健壮的方法总是使用专用的解析器。

至于你尝试了什么

因此,如果要使用纯文本处理,则必须通过$_.Context.PreContext[0]提取name属性值('variable'),如以下代码片段所示(请注意,-split '"'用于将行分割为",这意味着第二个([1])元素包含感兴趣的值):

# Sample input lines.
$lines = @'
<data name="variable" xml:space="preserve">
  <value>key phrase</value>
</data>
'@ -split '\r?\n' 

$lines | 
  Select-String -SimpleMatch 'key phrase' -Context 1 |
  ForEach-Object { ($_.Context.PreContext[0] -split '"')[1] }

输出:

variable

相关问题