簡體   English   中英

刪除外殼中的部分路徑

[英]Remove part of the path in shell

echo "/dir1/dir2/filename.txt" | sed ????

Sed表達式應該是什么才能獲得輸出

   /dir1/filename.txt

如果還有其他更簡單的方法可以做到這一點,也歡迎您。

你可以用cut來做:

$ echo "/dir1/dir2/filename.txt" | cut -d/ -f1,2,4
/dir1/filename.txt

使用sed有點混亂:

$ echo "/dir1/dir2/filename.txt" | sed 's/^\(\/.*\)\(\/.*\)\(\/.*\)/\1\3/'
/dir1/filename.txt

這個想法是用\\(\\/.*\\)獲取/text一部分,然后用\\1\\3打印我們想要的部分1和\\1\\3

這應該很好地完成了技巧awk '{$(NF-1)=$NF;NF--}1' FS='/' OFS='/'

$ echo "/dir1/dir2/filename.txt" | awk '{$(NF-1)=$NF;NF--}1' FS='/' OFS='/' 
/dir1/filename.txt

這樣做的好處是腳本不受字段數的影響,因此,給定任意數量的文件夾,文件總是移到父目錄中。

$ echo "/a/b/c/d/e/f/filename.txt" | awk '{$(NF-1)=$NF;NF--}1' FS='/' OFS='/' 
/a/b/c/d/e/filename.txt

通過將倒數第二個字段$(NF-)設置為最后一個字段$NF並減少字段NF--的數量來工作。

使用sed:

echo "/dir1/dir2/filename.txt" | sed 's:^\(.*\)/[^/]\+\(/[^/]\+\)$:\1\2:'

這將刪除最后一個目錄的名稱。

這可能對您有用:

echo "/dir1/dir2/filename.txt" | sed 's/\(.*\)\/.*\(\/.*\)/\1\2/'

要么

echo "/dir1/dir2/filename.txt" | sed 's/\(.*\)\/[^/]*\//\1\//'
 echo "/dir1/dir2/filename.txt" | sed 's/\/\w*//2'

Sidharth C Nadhan表示此回顯為“ /dir1/dir2/filename.txt” | sed's // \\ w * // 2',但要使其更具可讀性,請使用'!' (或者是其他東西)。

$ echo "/dir1/dir2/filename.txt" | sed 's!/\w*/!/!'
/dir2/filename.txt

's!/ \\ w * /!/!' 含義用/ \\ w替換/ \\ w * /是一個字符,*表示任何數字。 '!' 是一個分隔符。 即使解決方案已被接受,我也添加了此內容,但我認為它不那么丑陋,值得研究。

另外,如果將其用於bash腳本中,bash也擅長於此,並且由於bash內置於bash中,因此bash在相同的過程中效率更高。

$ f="/dir1/dir2/filename.txt";  echo $f; echo ${f/dir2\//}
/dir1/dir2/filename.txt
/dir1/filename.txt

不幸的是,您不能使用/以外的其他字符作為分隔符,而且我也無法弄清楚如何制作\\ w或[^ /] *或[a-z0-9] *或其他任何有效方法。 在這方面,bash不如sed好,而且我對bash的了解也不盡如人意。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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