【问题标题】:trying to grep file paths from pipe output试图从管道输出 grep 文件路径
【发布时间】:2021-06-12 09:48:46
【问题描述】:

我需要在 perforce 中找到不符合我们遵循的某些标准的文件路径。

基本上,我们在 perforce 路径中添加新文件的标准方法:- //depot/project/name/content/<sub_project>/<version>/...

这里 <sub_project> 应该是字母数字,<version> 应该是整数类型,例如:- 1.0 、 1.1 ...等。所以我需要找到不符合上述标准的文件。这是我的命令,我可以在其中获得遵循正确标准的输出路径。这是在此处使用egrep 的正确方法吗?

p4 files //depot/project/name/content/... | egrep "//depot/project/name/content/.+/[[:alnum:]]+"

假设我们有以下来自 p4 命令输出的行:-

//depot/project/name/content/cuda/sccm_2.1
//depot/project/name/content/cpla/test_3.1
//depot/project/name/content/ctest/arm_test
//depot/project/name/content/bfm/1.2
//depot/project/name/content/nvlog/1.0

我只对前三个路径感兴趣,即

//depot/project/name/content/cuda/sccm_2.1
//depot/project/name/content/cpla/test_3.1
//depot/project/name/content/ctest/arm_test

【问题讨论】:

  • 你能添加一些你想要的东西和你不想要的东西的例子吗?您可以将项目名称更改为 kuku、gaga 等以隐藏它们...
  • 嗨,我需要排除 中只有整数的文件路径。以其他方式一些项目文件在 中有字母数字,我需要列出它们。
  • 对不起,如果问题不清楚。有一些路径具有整数和字母的 ,即 alphanumeric 。我只对那些路径感兴趣。
  • 那么,p1.1 版可以,1.1 版不行?再次 - 一些输入示例会很棒
  • 我已经更新了我的查询...我只对具有字母数字版本或只有字母的路径感兴趣。

标签: linux shell unix perforce csh


【解决方案1】:

我不清楚您是否想将11.2.3 等版本视为无效。这会将这两个都视为无效,并要求版本号恰好有一个.。如果需要,很容易修改正则表达式:

awk '$NF !~ /^[0-9]*\.[0-9]*$/' FS=/ input

【讨论】:

    【解决方案2】:

    由于您没有给出可能的名称列表,我创建了一个示例列表:

    echo "//depot/project/name/content/gaga/1.1\n//depot/project/name/content/chomp{}/1.1\n//depot/project/name/content/kaka/99.7\n//depot/project/name/content/kuku/1"    
    

    //depot/project/name/content/gaga/1.1
    //depot/project/name/content/chomp{}/1.1
    //depot/project/name/content/kaka/99.7
    //depot/project/name/content/kuku/1

    为了找到我使用 grep -p 的 2 个匹配项(因为 perl 正则表达式更友好)

    echo "//depot/project/name/content/gaga/1.1\n//depot/project/name/content/chomp{}/1.1\n//depot/project/name/content/kaka/99.7\n//depot/project/name/content/kuku/1" | grep -P "//depot/project/name/content/\w+/\d+\.\d+"
    

    //depot/project/name/content/gaga/1.1
    //depot/project/name/content/kaka/99.7

    现在,如果您的版本可能缺少点,您可以将正则表达式更改为
    "//depot/project/name/content/\w+/\d+\.?\d*"

    最后但同样重要的是 - 如果您已经使用完整路径调用了 p4 命令,您可能会忽略正则表达式中的路径,因为它是由您提供的...

    更新
    鉴于您提供的输入,将正则表达式更新为
    grep -P "//depot/project/name/content/\w+/[a-zA-Z]\w+(\d\.\d+)?"
    如果文件名可能不以字母符号开头,请将它们添加到方括号中。

    > echo "//depot/project/name/content/cuda/sccm_2.1\n//depot/project/name/content/cpla/test_3.1\n//depot/project/name/content/ctest/arm_test\n//depot/project/name/content/bfm/1.2\n//depot/project/name/content/nvlog/1.0" | grep -P "//depot/project/name/content/\w+/[a-zA-Z]\w+(\d\.\d+)?"
    //depot/project/name/content/cuda/sccm_2.1
    //depot/project/name/content/cpla/test_3.1
    //depot/project/name/content/ctest/arm_test
    

    【讨论】:

      【解决方案3】:

      以下 grep 命令使用与所需路径匹配的正则表达式,但也使用 -v 选项来反转匹配。这具有返回不需要的路径的效果:

      grep -v -E "\/\/depot\/project\/name\/content\/[[:alnum:]]*\/([0-9]+\.?)*[0-9]+"
      

      正则表达式不允许<version>. 开头或结尾。此外,[:alnum:] 不包括 _-,因此如果需要,必须添加它们。

      所以从这个数据来看:

      //depot/project/name/content/cuda/sccm_2.1
      //depot/project/name/content/cpla/test_3.1
      //depot/project/name/content/ctest/arm_test
      //depot/project/name/content/bfm/1.2
      //depot/project/name/content/nvlog/1.0
      //depot/project/name/content/nvlog/.0
      //depot/project/name/content/bfm/10.2
      //depot/project/name/content/bfm/10.2.1.7
      //depot/project/name/content/nvlog/123545
      

      它会返回:

      //depot/project/name/content/cuda/sccm_2.1
      //depot/project/name/content/cpla/test_3.1
      //depot/project/name/content/ctest/arm_test
      //depot/project/name/content/nvlog/.0
      

      我认为这就是你想要的,但如果不是,请告诉我。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-17
        • 2022-01-02
        • 2023-02-20
        • 2011-07-17
        • 2021-01-09
        相关资源
        最近更新 更多