簡體   English   中英

試圖從 grep 文件路徑 pipe output

[英]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

我不清楚您是否想將11.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM