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

使用sed从多个文件中删除多行

  •  0
  • iamabhaykmr  · 技术社区  · 7 年前

    我正在尝试使用sed删除一些与正则表达式匹配的行。

    命令从要删除的所有文件中获取所有行

    grep  -P '.*Society[ \t]*([0-9]*[ \t]*[0-9]*)[ \t]*bhavan$' *.ann 
    

    file0122.ann:T324   Society 4520 4526   bhavan
    file0126.ann:T225   Society 9191 9197   bhavan
    file0319.ann:T84    Society 43 49   bhavan
    file0376.ann:T65    Society 2611 2617   bhavan
    file0627.ann:T171   Society 4104 4110   bhavan
    file1159.ann:T87    Society 4073 4079   bhavan
    file1533.ann:T150   Society 2787 2793   bhavan
    file1582.ann:T80    Society 2548 2554   bhavan
    file1813.ann:T115   Society 1213 1219   bhavan
    file1876.ann:T163   Society 1998 2004   bhavan
    file1879.ann:T165   Society 2513 2519   bhavan
    file2521.ann:T109   Society 326 332 bhavan
    file2537.ann:T100   Society 2574 2580   bhavan
    file3725.ann:T109   Society 2988 2994   bhavan
    

    我使用下面的sed命令从所有文件中删除上面的行

    sed -i -e '/.*Society[ \t]*([0-9]*[ \t]*[0-9]*)[ \t]*bhavan$/d' *.ann

    但它什么也没做。有谁知道我做错了什么吗?

    谢谢

    3 回复  |  直到 7 年前
        1
  •  2
  •   Thor    7 年前

    您只需添加 -v 切换到 grep . 这将反转逻辑,即仅选择与模式不匹配的线。

    从…起 grep.info :

    ‘-v’
    ‘--invert-match’
         Invert the sense of matching, to select non-matching lines.  (‘-v’
         is specified by POSIX.)
    
        2
  •  1
  •   Ed Morton    7 年前

    只需移除 ( ) 来自regexp,因为它们不存在于您的输入中。你在告诉grep使用PCRE( -P )其中,这些参数表示一个捕获组(您不使用该组,因此它们是冗余的),但随后调用sed而不使用任何特定于RE的选项,因此使用BRE,其中这些参数是文字字符。这个 .*

        3
  •  0
  •   iamabhaykmr    7 年前

    通过将小的e改为e来工作,其中包括sed中的--regexp扩展regex。

    sed -i -E '/.*Society[ \t]*([0-9]*[ \t]*[0-9]*)[ \t]*bhavan$/d' *.ann
    
    推荐文章