如何用PowerShell通过指定短语提取上一行中的目标单词
解决方案
问题分析
你的代码存在两个核心问题:
- 错误访问了匹配行(
$_.Line)而非目标上一行,上一行内容实际存储在$_.Context.PreContext[0]中 - 使用
Split(' ')拆分带引号的XML属性不可靠,既会把name="variable"当成一个整体,也无法应对空格数量变化的情况
方法一:正则提取上下文行的属性值
利用Select-String的-Context参数获取上一行,再通过正则精准捕获双引号包裹的属性值:
$var = Select-String $DirPath -Pattern 'key phrase' -SimpleMatch -Context 1 | ForEach-Object { # 获取匹配行的上一行并去除首尾空白 $prevLine = $_.Context.PreContext[0].Trim() # 正则匹配name属性的取值(捕获双引号内的内容) if ($prevLine -match 'name="([^"]+)"') { $matches[1] } }
方法二:直接解析XML(更可靠)
因为目标内容是标准XML结构,直接用XML解析器定位节点获取属性值,避免正则的局限性:
# 读取并加载XML文件 $xmlContent = Get-Content $DirPath -Raw $xml = [xml]$xmlContent # 通过XPath找到value为"key phrase"的data节点,提取name属性 $var = $xml.SelectNodes('//data[value="key phrase"]') | ForEach-Object { $_.name }
内容的提问来源于stack exchange,提问作者kmrydlx
相关产品推荐
相关产品推荐

