代码之家  ›  专栏  ›  技术社区  ›  Thufir

如何在PowerShell中将条件语句与regex一起使用?

  •  0
  • Thufir  · 技术社区  · 4 年前

    大约有十行数据。对于每一行数据,我想指出该行是否包含数字。

    我怎样才能为每一行打印一次“是,这一行有数字”或“否,这一行没有数字”?

    输出:

    thufir@dur:~/flwor/csv$ 
    thufir@dur:~/flwor/csv$ pwsh import.ps1 
    no digits
    
    Name
    ----                                                                           
    people…                                                                        
    
    thufir@dur:~/flwor/csv$ 
    

    $text = Get-Content -Raw ./people.csv
    [array]::Reverse($text)
    
    $tempAttributes = @()
    $collectionOfPeople = @()
    
    ForEach ($line in $text) { 
      if($line -notmatch '.*?[0-9].*?') {
        $tempAttributes += $line 
        Write-Host "matches digits"   
      }
      else {
        Write-Host "no digits"   
        $newPerson = [PSCustomObject]@{
          Name       = $line
          Attributes = $tempAttributes
        }
        $tempAttributes = @()
        $collectionOfPeople += $newPerson
      }
    }
    
    $collectionOfPeople
    

    数据:

    people
    joe
    phone1
    phone2
    phone3
    sue
    cell4
    home5
    alice
    atrib6
    x7
    y9
    z10
    

    我打印“数字”或“没有数字”的唯一原因是作为一个标记来帮助构建对象。

    0 回复  |  直到 4 年前
        1
  •  1
  •   AdminOfThings    4 年前

    您可以使用以下选项:

    switch -regex -file people.csv {
        '\d' { "yes" ; $_ }
        default { "no"; $_ }
    }
    

    \d 是与数字匹配的正则表达式字符。A switch -regex 允许正则表达式用于匹配文本。这个 default 当不满足其他条件时,选择条件。 $_ 是正在处理的当前行。

    转换 通常比 Get-Content 用于逐行处理。因为您确实希望每行执行某些操作,所以可能不希望使用 -Raw


    # For Reverse Output
    $output = switch -regex -file people.csv {
        '\d' { "yes" ; $_ }
        default { "no"; $_ }
    }
    $output[($output.GetUpperBound(0))..0)]