为什么这个sed命令不起作用?

时间:2015-02-08 17:22:20

标签: regex sed

我想从pwd命令的结果中删除父目录的某些部分。第一步,我想在sed'home'之后获得字符串部分,但老实说我不知道​​我做错了什么。我想我已经正确设置了子串,并成为sed替代品的输出。

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

2 个答案:

答案 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
  • #会从字符串
  • 的左(开头)找到一个glob图案
  • */home将删除所有内容,直到/home <{1}}的第一次出现,价值为PWD左起

答案 1 :(得分:3)

您需要使用.*匹配任何字符零次或多次)而不是\**是正则表达式中的一个特殊字符,它重复前一个令牌零次或多次。正则表达式中的点匹配除换行符之外的任何字符。

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

OR

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

使用正斜杠以外的其他正则表达式分隔符,因为您的输入包含正斜杠。有时它可能会导致网格。