我想從pwd命令的結果中去掉父目錄的一部分。第一步,我想用sed在'home'之後得到字符串部分,但我真的不知道我做錯了什麼。我想我已經正確設置了要創建的子字符串並且是sed替代品的輸出。爲什麼這個sed命令不工作?
$ pwd
/home/user1/projects/bashscript
$ pwd | sed -r 's/\*home(\*)/\1/'
/home/user1/projects/bashscript
我想從pwd命令的結果中去掉父目錄的一部分。第一步,我想用sed在'home'之後得到字符串部分,但我真的不知道我做錯了什麼。我想我已經正確設置了要創建的子字符串並且是sed替代品的輸出。爲什麼這個sed命令不工作?
$ pwd
/home/user1/projects/bashscript
$ pwd | sed -r 's/\*home(\*)/\1/'
/home/user1/projects/bashscript
正確的正則表達式的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
從左起您需要使用.*
(匹配任意字符零次或多次),而不是\*
。 *
是正則表達式中的一個特殊字符,它重複以前的標記零次或多次。正則表達式中的點匹配除換行符之外的任何字符。
$ pwd | sed -r 's~.*/home/(.*)~\1~'
OR
$ pwd | sed -r 's~.*/home(/.*)~\1~'
使用不同的正則表達式的分隔符不是正斜槓等,因爲你的輸入中包含正斜槓。有時它可能會導致網格。
感謝您的建議! – kwagjj 2015-02-08 17:29:21
怎麼來'。'使所有的區別?沒有一個點只是表示某個角色? *可能意味着更多更長的時間,爲什麼沒有一個*就足夠了? – kwagjj 2015-02-08 17:26:22
@kwagjj:'*'可以匹配shell中的任何內容,即glob模式,但是在正則表達式中正確的模式是'。*' – anubhava 2015-02-08 17:27:49
glob模式..我會研究這一點。哦,感謝bash的建議。我認爲這是我所需要的 – kwagjj 2015-02-08 17:28:59