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

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

  •  0
  • ivand58  · 技术社区  · 8 年前

    给出了两个单词/模式:P1和P2。如何使用实现管道过滤器 grep ,抑制 每一个 以P1结尾的线, 除了 那些包含P2的?

    编辑:示例,其中P1为“ok”P2为“重定义”:

    1. 应通过

      X X not found.
      : X ;  Redefine X.  ok.
      ok. is not at end of line
      ?
      
    2. 应抑制

      : X ;   ok.
      
    3 回复  |  直到 8 年前
        1
  •  2
  •   tripleee    8 年前

    如果Awk解决方案是可以接受的,那么它很简单。

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

    具有 grep -P 你可以说

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

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

        2
  •  0
  •   Gilles Quénot ticktalk    8 年前

    请参见:

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

    检查 look around regex

        3
  •  0
  •   davernator    8 年前

    因为“抑制P1$,除非包含P2”类似于“允许P1后跟某物或P2后跟末尾的P1”:

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