如何使用nand(负AND)逻辑表达式进行grep?

时间:2018-03-29 13:15:54

标签: bash grep

给出两个单词/模式:P1和P2。如何实现一个Add-Type -AssemblyName Microsoft.VisualBasic $datatable = New-Object System.Data.DataTable $src = "D:\Downloads\test.txt" $reader = New-Object -TypeName Microsoft.VisualBasic.FileIO.TextFieldParser -ArgumentList $src $reader.Delimiters = @(",") #Default values, but wanted to show the options $reader.HasFieldsEnclosedInQuotes = $true $reader.TrimWhiteSpace = $true #Get header as array $columns = $reader.ReadFields() foreach ($column in $columns) { $datatable.columns.add($column) } while($fields = $reader.ReadFields()) { $row = $datatable.NewRow() #Insert value in property using field(column) index for ($i = 0; $i -lt $columns.Count; $i++) { $row.($columns[$i]) = $fields[$i] } $datatable.Rows.Add($row) } $reader.Close() 的管道过滤器,用于抑制以P1结尾的每个行,除了包含P2的那些?

编辑:示例,其中P1为"确定。"和P2是"重新定义" :

  1. 应该通过

    grep
  2. 应该被压制

    X X not found.
    : X ;  Redefine X.  ok.
    ok. is not at end of line
    ?
    

3 个答案:

答案 0 :(得分:2)

如果Awk解决方案可以接受,那就很简单了。

awk '/P2/ || !/P1$/' file

使用grep -P,您可以说

grep -P 'P2|(?!P1$).{0,2}$' file

但这很难理解而且不便携。还要注意,最后一个量词需要更新以匹配P1的长度(如果行太短而不能完全包含它,它应该允许短于P1的字符串。)

答案 1 :(得分:0)

见:

$ printf '%s\n' P1 P2 | grep -vP 'P(?=1)'
P2

检查look around regex

答案 2 :(得分:0)

由于“抑制P1 $除非包含P2”就像“允许P1后跟某个东西或P2后跟任何后跟P1的东西”:

$ (echo "asdfP2lkj P1" ; echo "asdfP3lkj P1" ; echo "P1 z") | \
    grep -P 'P1.+|P2.*P1$'

asdfP2lkj P1
P1 z