2013-03-12 22 views
1

我有一個路徑,例如從而..bash的正則表達式匹配補丁

/Users/me/bla/dev/trunk/source/java/com/mecorp/sub/misc/filename.java 

我想能夠使用bash到例如某處創建在另一個目錄的封裝結構

com/mecorp/sub/misc/ 

我嘗試以下,但它不會工作。我能,如果我改變我的正則表達式來獲得比賽*讓我指的bash是確定的 - 一定有什麼毛病IM的方式引用正則表達式或者也許是正則表達式的自我。我看到這裏的工作..

http://regexr.com?3439m

這樣的IM困惑?

regex="(?<=/java)(.*)(?=/)" 


[[ $fullfile =~ $regex ]] 
echo "pkg name " ${BASH_REMATCH[0]} 

謝謝你的時間。

編輯 - 我使用OSX,所以它沒有所有這些漂亮的spiffy GNU擴展。使用GNU

回答

2

試試這個

$ echo '/Users/me/bla/dev/trunk/source/java/com/mecorp/sub/misc/filename.java' | 
    grep -oP 'java/\K.*/' 
com/mecorp/sub/misc/ 

http://regexr.com?3439p

或者使用

x="/Users/me/bla/dev/trunk/source/java/com/mecorp/sub/misc/filename.java" 
[[ $x =~ java/(.*/) ]] && echo ${BASH_REMATCH[1]} 

或者與

echo "$x" | awk -F/ '{print gensub(".*/java/(.*/).*", "\\1", $0)}' 

或者與

echo "$x" | sed -e '[email protected]*/java/\(.*/\).*@\[email protected]' 
+0

進出口運行OSX和即時通訊沒有任何運氣答案1的grep args。答案2看起來更好,但它似乎包含匹配中的java/dir。不過,我非常感謝你的幫助@sputnkick :)! – wmitchell 2013-03-12 03:54:39

+0

看到我的2最新和最新的命令,應該做的伎倆 – 2013-03-12 10:30:28

+1

優秀的sed做我的業務。 Awk似乎沒有找到gensub。我會調查一下,只是爲了好奇,但你讓我設置sed。 Merci beaucoup monsieur! – wmitchell 2013-03-12 17:01:24

0

如果試圖/java/後解壓路徑,你可以用這個做到這一點:

path=/Users/me/bla/dev/trunk/source/java/com/mecorp/sub/misc/filename.java 
package=`echo $path | sed -r 's,^.*/java/(.*/).*$,\1,'` 
+0

感謝您的評論看起來不像我的sed版本支持-r選項。 (Mac OSX) – wmitchell 2013-03-12 04:19:03