2015-02-08 47 views
1

我想從pwd命令的結果中去掉父目錄的一部分。第一步,我想用sed在'home'之後得到字符串部分,但我真的不知道我做錯了什麼。我想我已經正確設置了要創建的子字符串並且是sed替代品的輸出。爲什麼這個sed命令不工作?

$ pwd 
/home/user1/projects/bashscript 
$ pwd | sed -r 's/\*home(\*)/\1/' 
/home/user1/projects/bashscript 

回答

6

正確的正則表達式的sed是:

pwd | sed -r 's/.*home(.*)/\1/' 

*可以匹配在外殼即glob模式任何東西,但在正則表達式等效圖案是.*

但是,如果您使用的是bash,則無需使用sed。您可以使用bash的字符串操作它:

echo "${PWD/\/home/}" 

更新:基於以下埃德的評論是否有PWD多個/home

假設PWD=/foo/123/home/dir/home/abcd

更正確的使用方法:

echo "${PWD#*/home}" 
/dir/home/abcd 
  • #將找到的glob模式字符串
  • */home將刪除一切,直到的左(開始)第一次出現/home值得從PWD從左起
+0

怎麼來'。'使所有的區別?沒有一個點只是表示某個角色? *可能意味着更多更長的時間,爲什麼沒有一個*就足夠了? – kwagjj 2015-02-08 17:26:22

+0

@kwagjj:'*'可以匹配shell中的任何內容,即glob模式,但是在正則表達式中正確的模式是'。*' – anubhava 2015-02-08 17:27:49

+1

glob模式..我會研究這一點。哦,感謝bash的建議。我認爲這是我所需要的 – kwagjj 2015-02-08 17:28:59

3

您需要使用.*匹配任意字符零次或多次),而不是\**是正則表達式中的一個特殊字符,它重複以前的標記零次或多次。正則表達式中的點匹配除換行符之外的任何字符。

$ pwd | sed -r 's~.*/home/(.*)~\1~' 

OR

$ pwd | sed -r 's~.*/home(/.*)~\1~' 

使用不同的正則表達式的分隔符不是正斜槓等,因爲你的輸入中包含正斜槓。有時它可能會導致網格。

+0

感謝您的建議! – kwagjj 2015-02-08 17:29:21