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