Regex

如何使用 sed 從路徑中提取最後兩個(或任意數量)目錄?

  • September 1, 2018

我真的在這裡尋找一個通用的解決方案,但為了舉例,假設我正在尋找路徑中最深的2 個目錄。例如:給定路徑/home/someone/foo/bar,我如何使用 sed(或 awk)來獲取foo/bar

如果路徑的第一部分始終相同,那將很簡單,但就我而言,我正在尋找一個適用於任何任意路徑的表達式,理想情況下,適用於任何 depth n

如果路徑的級別少於n(在這種情況下為 2)級別,那麼命令的行為方式並不重要。

我今天去做這個,發現它很棘手。我開始編寫一個循環來代替它,但我無法擺脫這種必須在單個命令中實現的感覺。我可能是錯的。有任何想法嗎?

echo "/your/directory/here/bla" | awk -F"/" '{ print "/"$(NF-1)"/"$NF }'

應該可以找到,我沒有嘗試,但是這樣的東西應該​​可以工作:

find /yourfolder/structure -type d | awk -F"/" '{ print "/"$(NF-1)"/"$NF }'

供參考, $ NF is the latest field found in awk, $ (NF-1),前一個。

在 awk 中,將欄位分隔符更改為斜線:

$ echo /home/someone/foo/bar | awk -F / -v OFS=/ '{ print $(NF-1), $NF }'
foo/bar

這會將輸入欄位分隔符和輸出欄位分隔符都設置為斜線,然後列印倒數第二個欄位值、欄位分隔符和最後一個欄位值。

n 值解

$ echo /home/someone/foo/bar | awk -F / -v n=3 '
   { o = $NF; for (f=1; f<n; f++) o = $(NF-f) "/" o; print o }
 '
someone/foo/bar

這使用循環來提取所需數量的目錄。

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