使用grep reverse来摆脱一条线和一些之前

时间:2016-02-28 15:19:01

标签: regex grep

我想摆脱一个包含以下模式的行:

  1. CE1(2或8#CE1(数字2或8
  2. CE2(-1-17-2或8#CE2(从-1到17的任何数字,短划线,数字2或8
  3. 之前有6行,之后是1行。

    $scope.mktname[1]

    这个尝试似乎与我的模式匹配(它是否按照我明确描述的那样做了?)但我正在考虑使用反向选项从我的文件中删除该模式搜索。可能吗?它似乎不起作用。

2 个答案:

答案 0 :(得分:2)

不是一个完整的答案,而是一些解释:

字符类只匹配一个字符。字符类中的连字符,当它不表示文字连字符(在第一个位置,最后,转义时或^之后<)>时,定义一个范围字符,但不是一系列数字。 (在角落处使用ascii表进行一些尝试以便很好地理解。)

[-1-17]匹配以下其中一个字符:

  • 字面连字符(因为在开头)
  • 范围1-1(所以1)
  • 中的字符
  • 角色7

要匹配-1到17之间的整数,您需要:

\(-1\|1[0-7]\|[0-9]\)

答案 1 :(得分:1)

最简单和最强大(因为即使当跳过的范围包括与正则表达式匹配的行或当范围从输入文件的开始/结束开始运行时)它的工作方式,恕我直言,是2次传递 - 第一次识别要跳过的行,第二行跳过这些行:

$ cat file
a 1
b 2
c 3
d 4
e 5
f 6
g 7
h 8
i 9

$ awk -v b=3 -v a=1 'NR==FNR{if (/f/) for (i=NR-b;i<=NR+a;i++) skip[i]; next} !(FNR in skip)' file file
a 1
b 2
h 8
i 9

只需将/f/更改为/<your regexp of choice>/,然后根据需要设置b(efore)和(fter)值。

至于你的特定正则表达式,你没有提供任何样本输入和预期输出供我们测试,但我认为你想要的可能是:

awk -v b=6 -v a=1 'NR==FNR{if (/CE(1|2(-1|[0-9]|1[0-7])-)[28]/) for (i=NR-b;i<=NR+a;i++) skip[i]; next} !(FNR in skip)' file file