【问题标题】:Regular Expression - Pattern正则表达式 - 模式
【发布时间】:2017-03-25 14:25:05
【问题描述】:

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

文件内容,比如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”可用。所以,输出看起来 喜欢:
3 chdc4326aee6.om,bhuvi,01-Oct-2016
5 praaeei5 om,lucknow,11-Nov-2016
  1. 过滤文件中只有 "ae" 和 "ae + "aee" 的行。所以, 输出将如下所示:
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 chdc501ae.om,patna,26-Aug-2016

请有任何建议。您可以指出一个获取更多相关信息的好地方,以便我学习。

【问题讨论】:

  • 这是一个很好的例子,说明如何在 shell 脚本上使用正则表达式 stackoverflow.com/questions/19737675/…
  • 嗨,蒂姆,我正在尝试使用 bash shell 编写基本的 Shell 脚本
  • 同样,如果你想学习正则表达式,只要谷歌它,你就会有很多地方可以开始
  • 您将需要使用负前瞻来实现您想要的。您可以尝试以下正则表达式并告诉我们它是否有效:^((?!aee).)*ae((?!aee).)*$
  • command: cat names.txt |grep '^((?!aee).)*ae((?!aee).)*$' 没有输出。

标签: regex shell


【解决方案1】:

使用带有选项 -P 和前瞻的 grep

文件:

$ 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

【讨论】:

  • @Ram:不客气,很高兴它有帮助。如果对您有用,请随意将答案标记为已接受。
  • 谢谢托托先生……坦率地说,我真的不明白这些说法。这真的解决了我的问题......有没有地方让我了解更多这样的东西......我用谷歌搜索和搜索......仍在谷歌搜索......
  • @Ram:你会在这里找到一个正则表达式教程:regular-expressions.info 对于grep -P,只需执行man grep
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-02-12
  • 2018-10-29
  • 2018-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多