在文件路径中删除最后一个斜杠之前的所有内容

20

我有一个文件中的很多文件路径,看起来像这样:

/home/rtz11/files/testfiles/547/prob547455_01

我想使用一个 bash 脚本,将所有的文件名打印到屏幕上,基本上就是最后一个 / 后面的内容。我不想假设它总是相同的长度,因为它可能不是。

是否有一种方法可以删除最后一个 / 之前的所有内容?也许可以用 sed 命令来实现吗?


你是否也想要删除最后一个 /,还是只删除它之前的内容? - Charles Duffy
4个回答

43

对于这个问题,使用sed是过度杀伤力的做法——bash内置了广泛的字符串操作支持,使用这种内置支持在只操作单行时更加高效。

s=/home/rtz11/files/testfiles/547/prob547455_01
basename="${s##*/}"
echo "$basename"

这将贪婪地匹配*/并从字符串开头删除所有内容。请参阅参数扩展的bash-hackers wiki条目
如果您只想删除最后一个斜杠之前的所有内容,但不包括它(这是对您问题的文字解释,但也是一种通常不太有用的操作),您可能需要使用if [[ $s = */* ]]; then echo "/${s##*/}"; else echo "$s"; fi

1
优秀的资源。顺便提一下,如果你需要文件路径,请使用${PATHNAME%/*} - Ashesh

20
awk '{print $NF}' FS=/ input-file

'print $NF'指示awk打印每行的最后一个字段,并将FS=/分配为正斜杠字段分隔符。在sed中,您可以执行以下操作:

sed 's@.*/@@' input-file

这个操作会删除最后一个 / 及之前的所有内容。


请注意,符号@仅用作分隔符,替换了通常的正斜杠/。后者不能轻易使用,因为它构成了目标。等效的命令是sed s|.*/||'sed 's:.*/::' - Serge Stroobandt

3

我写的代码有些曲折,但只是因为我能记得我使用的语法:

Original Answer翻译成:"最初的回答"

cat file | rev | cut -d/ -f1 | rev

许多种方法可以解决问题,但有些可能会让人很疼。最初的回答。

这太贵了,虽然它能胜任工作。 - codeforester

0
还有一种方法:
使用basename可执行文件(命令):
basename /path/with/many/slashes/and/file.extension

>file.extension

basename /path/with/many/slashes/and/file.extension .extension

或者

basename -s .extension /path/with/many/slashes/and/file.extension 

> 文件


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接