![](/img/trans.png)
[英]Grep a file output from another set of grep/awk command pipe
[英]trying to grep file paths from pipe output
我需要在 perforce 中找到不遵循我們遵循的某些標准的文件路徑。
基本上,我們在 perforce 路徑中添加新文件的標准方法:- //depot/project/name/content/<sub_project>/<version>/...
這里<sub_project>
應該是字母數字,而<version>
應該只是integer 類型,例如:- 1.0、1.1...等。 所以我需要找到不符合上述標准的文件。 這是我的命令,我可以獲得遵循正確標准的 output 路徑。 這是在這里使用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
我不清楚您是否想將1
或1.2.3
等版本視為無效。 這會將這兩個都視為無效,並要求版本號恰好有一個.
. 如果需要,很容易修改正則表達式:
awk '$NF !~ /^[0-9]*\.[0-9]*$/' FS=/ input
由於您沒有提供可能名稱的列表,因此我創建了一個示例列表:
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"
//倉庫/項目/名稱/內容/gaga/1.1
//depot/project/name/content/chomp{}/1.1
//depot/project/name/content/kaka/99.7
//倉庫/項目/名稱/內容/kuku/1
為了找到 2 個匹配項,我使用grep -p
(因為 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+"
//倉庫/項目/名稱/內容/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
以下 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
我想這就是你想要的,但如果不是,請告訴我。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.