我想从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