正则表达式 - 模式

时间:2016-11-11 11:00:32

标签: regex shell

我是Shell脚本的新手。我正在尝试编写一个代码,该代码应根据特定条件从一个巨大的文件中删除几行。

文件内容,例如 names.txt

1 ae1aee2sonata om,vadodara,23-Aug-2016
2 chdc501ae om,patna,26-Aug-2016
3 chdc4326aee6 om,bhuvi,01-Oct-2016
4 ae3aee6prsons hqr,bangalore,29-Aug-2016
5 praaeei5 om,lucknow,11-Nov-2016
6 aetaeen6pana om,phanto,13-Oct-2016

继续进行500次以上的参赛作品。

现在,我正在寻找以下输出:

  1. 过滤仅有“aee”的行。所以,输出看起来 像:
  2. 3 chdc4326aee6.om,bhuvi,01-Oct-2016
    5 praaeei5 om,lucknow,11-Nov-2016
    
    1. 在文件中只有“ae”和“ae +”aee“的过滤行。所以, 输出结果如下:
    2. 1 ae1aee2sonata.hqr,vadodara,23-Aug-2016
      2 chdc501ae.om,patna,26-Aug-2016
      4 ae3aee6prsons hqr,bangalore,29-Aug-2016
      6 aetaeen6pana om,phanto,13-Oct-2016
      
      1. 从文件中仅过滤“ae”的行。因此,输出将如下所示:
      2. 2 chdc501ae.om,patna,26-Aug-2016
        

        请提出任何建议。你可以指出一个获得更多相关信息的好地方,所以我可以学习。

1 个答案:

答案 0 :(得分:1)

将grep与选项-P和lookahead

一起使用

文件:

$ cat data.txt 
1 ae1aee2sonata om,vadodara,23-Aug-2016
2 chdc501ae om,patna,26-Aug-2016
3 chdc4326aee6 om,bhuvi,01-Oct-2016
4 ae3aee6prsons hqr,bangalore,29-Aug-2016
5 praaeei5 om,lucknow,11-Nov-2016
6 aetaeen6pana om,phanto,13-Oct-2016

查找aee但不是ae

$ grep -P '^(?:(?=.*aee[^e]))?(?!.*ae[^e]).*(aee)[^e]' data.txt 
3 chdc4326aee6 om,bhuvi,01-Oct-2016
5 praaeei5 om,lucknow,11-Nov-2016

查找aeae + aee

$ grep -P '^(?:(?!.*aee[^e]))?(?=.*ae[^e]).*(aee?)[^e]' data.txt
1 ae1aee2sonata om,vadodara,23-Aug-2016
2 chdc501ae om,patna,26-Aug-2016
4 ae3aee6prsons hqr,bangalore,29-Aug-2016
6 aetaeen6pana om,phanto,13-Oct-2016

仅查找ae

$ grep -P '^(?!.*aee[^e])(?=.*ae[^e]).*(ae)[^e]' data.txt
2 chdc501ae om,patna,26-Aug-2016