echo "/dir1/dir2/filename.txt" | sed ????
刪除路徑的一部分應該是什麼桑達表達,以獲得輸出殼
/dir1/filename.txt
如果有任何其他實現這個簡單的方法,那就是也歡迎。
echo "/dir1/dir2/filename.txt" | 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\3
。
使用的sed:
echo "/dir1/dir2/filename.txt" | sed 's:^\(.*\)/[^/]\+\(/[^/]\+\)$:\1\2:'
這將去掉最後一個目錄的名稱。
感謝您的回覆。 – Gopal 2013-04-25 10:26:35
這可能會爲你工作:
echo "/dir1/dir2/filename.txt" | sed 's/\(.*\)\/.*\(\/.*\)/\1\2/'
或
echo "/dir1/dir2/filename.txt" | sed 's/\(.*\)\/[^/]*\//\1\//'
感謝您的回覆。 – Gopal 2013-04-25 10:27:37
echo "/dir1/dir2/filename.txt" | sed 's/\/\w*//2'
這應該做的伎倆很好awk '{$(NF-1)=$NF;NF--}1' FS='/' OFS='/'
:
$ echo "/dir1/dir2/filename.txt" | awk '{$(NF-1)=$NF;NF--}1' FS='/' OFS='/'
/dir1/filename.txt
這樣做的優點是腳本個獨立t的字段數如此給定任意數量的文件夾,文件總是移動到父目錄中。
$ echo "https://stackoverflow.com/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--
的數量。
好的!我喜歡泛化(+1),儘管OP可能只需要第一個和最後一個,不是全部,而是倒數第二個。 – fedorqui 2013-04-25 10:14:43
@fedorqui我想到了同樣的想法。 'awk'的美是對規範的小修改並不意味着從頭開始重寫正則表達式。對於第一個和最後一個'awk'{$ 3 = $ NF; NF = 3} 1'FS ='/'OFS ='/''。 – 2013-04-25 10:21:59
Sidharth C Nadhan said this echo「/dir1/dir2/filename.txt」| sed的// \ w * // 2' 但爲了使其更具可讀性,請使用'!' (或者是其他東西)。
$ echo "/dir1/dir2/filename.txt" | sed 's!/\w*/!/!'
/dir2/filename.txt
's!/ \ w * /!/!'含義替換/ \ w */with/ \ w是一個字 - 字符和*表示任何數字。 '!'是一個分隔符。 即使解決方案已被接受,我也添加了這個,但我認爲這是非常不那麼醜陋,值得一看。另外,如果這是在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是否應該如此。
真棒切。非常感謝。 – Gopal 2013-04-25 10:26:19