当第一部分完全匹配时检索线的第二部分

时间:2016-06-29 18:46:18

标签: powershell powershell-v2.0

我使用以下步骤从文件中检索字符串

$variable = 'abc@yahoo.com'
$test = $variable.split('@')[0];
$file = Get-Content C:\Temp\file1.txt | Where-Object { $_.Contains($test) }
$postPipePortion = $file | Foreach-Object {$_.Substring($_.IndexOf("|") + 1)}

这会导致包含$test的所有行作为子字符串。我只希望结果只包含与$test完全匹配的行。

例如,如果文件包含

abc_def|hf#23$ 
abc|ohgvtre

我只想要文字ohgvtre

2 个答案:

答案 0 :(得分:1)

如果我正确理解了这个问题,您可能想要使用Import-Csv代替Get-Content

Import-Csv 'C:\Temp\file1.txt' -Delimiter '|' -Header 'foo', 'bar' |
  Where-Object { $_.foo -eq $test } |
  Select-Object -Expand bar

答案 1 :(得分:1)

要解决完全匹配问题,您应该测试相等性(-eq)而不是子字符串(.Contains())。此外,无需多次解析数据。以下是您的代码,重写为使用-split运算符对数据进行一次操作。

$variable = 'abc@yahoo.com'
$test = $variable.split('@')[0];

$postPipePortion = (

  # Iterate once over the lines in file1.txt
  Get-Content C:\Temp\file1.txt | foreach {

    # Split the string, keeping both parts in separate variables.
    # Note the backslash - the argument to the -split operator is a regex
    $first, $second = ($_ -split '\|')

    # When the first half matches, output the second half.
    if ($first -eq $test) {
      $second
    }
  }
)