Regex

正則表達式:從行尾匹配兩個 /

  • September 4, 2018

我有一個文件路徑文件。目錄的深度有各種長度和路徑名。我想向後匹配兩個目錄(兩個/)並刪除匹配項,創建一個包含結果的新文件。

例如:

/dir1/dir2/dir3/dir4/dir5/dir6/dir7/output_job3344.xml
/dir1/dir2/dir3/dir4/dir5/otherfile.txt

結果將是:

/dir1/dir2/dir3/dir4/dir5/dir6/
/dir1/dir2/dir3/dir4/

我試過這樣的事情:

awk -F'/*./.*$' '{print $0}' deep.list

但這沒有成功。

你的想法很聰明,但需要一些更正。這可能是您的意思:

awk -F'[^/]*/[^/]*$' '{print $1}' deep.list

解釋:

首先,您可能拼錯.**..

然後,*修飾符是greedy,因此您需要注意它不會超出您的預期!解決方案很簡單,儘管可讀性稍差:使用[^/]*而不是.*. 這樣,您可以匹配除 之外的任何字元/

最後,$0表示整行,通過指定一個特製的自定義欄位分隔符,絲毫沒有改變。在這種情況下,您想列印第一個欄位:$1.


這是與@ender.qa連結的兩個答案不同的方法:

awk '{gsub("[^/]+/[^/]+$","");print}' deep.list

還有一個使用循環:

awk -F/ '{for(i=1;i<=NF-2;i++){printf "%s/",$i}; print ""}' deep.list

替換方法在 Perl 中更容易實現:

perl -lape 's"[^/]+/[^/]+$""' deep.list

或 sed:

sed -E 's"[^/]+/[^/]+$""' deep.list

引用自:https://serverfault.com/questions/927408