我想从pwd命令的结果中删除父目录的某些部分。第一步,我想在sed'home'之后获得字符串部分,但老实说我不知道我做错了什么。我想我已经正确设置了子串,并成为sed替代品的输出。
$ pwd
/home/user1/projects/bashscript
$ pwd | sed -r 's/\*home(\*)/\1/'
/home/user1/projects/bashscript
答案 0 :(得分:6)
正确的sed正则表达式是:
pwd | sed -r 's/.*home(.*)/\1/'
*
可以匹配shell中的任何内容,即 glob pattern ,但正则表达式等效模式为.*
。
但是,如果您使用的是bash
,则无需使用sed
。您可以使用 bash字符串操作:
echo "${PWD/\/home/}"
更新:如果/home
中有多个PWD
,则根据Ed的评论。
假设PWD=/foo/123/home/dir/home/abcd
:
使用更正确:
echo "${PWD#*/home}"
/dir/home/abcd
#
会从字符串*/home
将删除所有内容,直到/home
<{1}}的第一次出现,价值为PWD
左起答案 1 :(得分:3)
您需要使用.*
(匹配任何字符零次或多次)而不是\*
。 *
是正则表达式中的一个特殊字符,它重复前一个令牌零次或多次。正则表达式中的点匹配除换行符之外的任何字符。
$ pwd | sed -r 's~.*/home/(.*)~\1~'
OR
$ pwd | sed -r 's~.*/home(/.*)~\1~'
使用正斜杠以外的其他正则表达式分隔符,因为您的输入包含正斜杠。有时它可能会导致网格。