【问题标题】:regex how to find a line with a word started with xxxx正则表达式如何找到以 xxxx 开头的单词的行
【发布时间】:2020-08-15 08:08:33
【问题描述】:

我有很多文件都有这样的行

#include <xxxx/nnnnn/xxxx_files_names.h> 

我想用 grep 搜索这个模式,文件也有内容,比如 test xxxx_files_names_yyyy。但我不想在我的 grep 搜索中使用 xxxx_files_names_yyyy。我只想要

#include <xxxx/nnnnn/xxxx_files_names.h> 

【问题讨论】:

  • 实现我认为你想要的最简单的方法是grep xxxx file | grep -v yyyy。你真的会浪费很多时间来尝试构建一个在一个过程中同时完成这两项工作的正则表达式。这不值得(恕我直言)。祝你好运。

标签: regex linux unix grep


【解决方案1】:

又快又脏,正如 shellter 在评论中建议的那样:

grep 'xxxx' file | grep -v 'yyyy'

我称之为“脏”,因为如果 yyyy 是您路径的一部分,它也会被过滤掉,这是不希望的。

使用 grep -P 和负向查找

kent$  cat ff
#include <xxxx/nnnnn/xxxx_files_names.h> 
#include <xxxx/yyyy/xxxx_files_names.h>  <-we want it!
#include <xxxx/nnnnn/xxxx_files_names_yyyy.h> 

kent$  grep -P 'xxxx.*(?<!yyyy)[.]h' ff
#include <xxxx/nnnnn/xxxx_files_names.h> 
#include <xxxx/yyyy/xxxx_files_names.h>  <-we want it!

【讨论】:

    【解决方案2】:

    正如@Shellter 所解释的那样,简单的 grep 应该很好。为了便于理解,我将添加测试和结果, 我正在搜索 3 个文件 test1.txt、test2.txt 和 test3.txt,您可以将其保留为通配符“*”以在文件夹中进行全局搜索。

    当搜索模式时,它返回所有匹配的模式,grep 不关心模式的前缀/后缀,返回整行。

     $grep "india" test*
        test1.txt:india.a
        test1.txt:india_a
        test1.txt:india_z
        test2.txt:india.a
        test2.txt:india_a
        test2.txt:india_z
        test3.txt:india.a
        test3.txt:india_a
        test3.txt:india_z
    

    当从文件中搜索完全匹配的行时,将返回匹配的行。

    $grep "india_a" test*
    test1.txt:india_a
    test2.txt:india_a
    test3.txt:india_a
    

    排除特定模式的另一种方法是使用“grep -v”,如下所示,这将从第一个 grep 返回的输出中排除具有该模式的行。

    $grep "india" test* | grep -v "india_z"
    test1.txt:india.a
    test1.txt:india_a
    test2.txt:india.a
    test2.txt:india_a
    test3.txt:india.a
    test3.txt:india_a
    

    【讨论】:

      猜你喜欢
      • 2014-07-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-23
      相关资源
      最近更新 更多