Regex
正則表達式:從行尾匹配兩個 /
我有一個文件路徑文件。目錄的深度有各種長度和路徑名。我想向後匹配兩個目錄(兩個/)並刪除匹配項,創建一個包含結果的新文件。
例如:
/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