2010-07-04 124 views
7

如何使用sed删除最后一个目录,例如:如何从sed路径中删除最后一个目录(不使用dirname)?

echo "/dir1/dir2/dir3/dir4" | sed ..... 

所以我会得到/dir1/dir2/dir3

+0

请,更注重格式和你的答案的措词。 – 2010-07-04 14:10:05

+1

@Pavel:ummm,errrr,问题? (和注释);-) – 2010-07-05 04:04:05

+1

@丹尼斯,EPIC失败,无法恢复:-D – 2010-07-05 05:05:09

回答

7
sed 's,/*[^/]\+/*$,,' 

如果它是shell脚本的一部分,那么dirname肯定会更清晰。

+0

如果目录中有“。”,则不起作用。 (期间)的名字 – 2014-08-05 15:33:41

+0

@ChrisF Huh?你为什么这么写? 'echo a.b/c.d/e.f | sed's,/ * [^ /] \ +/* $ ,,''返回'a.b/c.d'或者它不在你的sed版本中?我的正则表达式与'.'完全无关。 – przemoc 2015-01-31 23:01:41

3

echo“/ etc1/etc2/etc3/etc”| SED -e “S // [^ /] * $ //”

产生

/ETC1/ETC2/etc3

在不最后一个斜线后的端基本上剥离的任何包含另一个斜线。

+1

糟糕,使用逗号作为przemoc所指定的分隔符会更好,以避免必须在脚本中跳过斜杠,使其更具可读性。我总是犯这个错误。 – 2010-07-04 14:13:03

24

你没有使用外部工具

$ a="/dir1/dir2/dir3/dir4"

$ echo ${a%/*}

+0

虽然目前接受的答案绝对是好的,但我相信如果问题属于bash,这个答案应该是被接受的答案。 Bash参数替换感觉比sed更加“真实”。 – anuragw 2017-03-15 21:42:17

0

您可以使用 “目录名” shell命令:

dirname /dir2/dir3/dir4 
相关问题