2013-04-25 41 views
0
echo "/dir1/dir2/filename.txt" | sed ???? 

刪除路徑的一部分應該是什麼桑達表達,以獲得輸出

/dir1/filename.txt 

如果有任何其他實現這個簡單的方法,那就是也歡迎。

回答

2

你可以用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

+1

真棒切。非常感謝。 – Gopal 2013-04-25 10:26:19

0

使用的sed:

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

這將去掉最後一個目錄的名稱。

+0

感謝您的回覆。 – Gopal 2013-04-25 10:26:35

0

這可能會爲你工作:

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

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

感謝您的回覆。 – Gopal 2013-04-25 10:27:37

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

這應該做的伎倆很好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--的數量。

+0

好的!我喜歡泛化(+1),儘管OP可能只需要第一個和最後一個,不是全部,而是倒數第二個。 – fedorqui 2013-04-25 10:14:43

+1

@fedorqui我想到了同樣的想法。 'awk'的美是對規範的小修改並不意味着從頭開始重寫正則表達式。對於第一個和最後一個'awk'{$ 3 = $ NF; NF = 3} 1'FS ='/'OFS ='/''。 – 2013-04-25 10:21:59

0

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是否應該如此。