2015-02-08 116 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