关于Unix:删除bash中最后一个之前的所有内容

Delete everything before last / in bash

在一个文件中,我有许多这样的文件路径:

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

我想使用一个bash脚本,它只将所有文件名打印到屏幕上。所以基本上在最后一个/之后。我不想假定它总是相同的长度,因为它可能不是。在最后一个/之前,是否有删除所有内容的方法?也许是一个sed命令?任何帮助都将不胜感激!


使用sed是一种巨大的过度杀伤力——bash内置了大量的字符串操作,使用这种内置支持在仅在一条线上操作时效率要高得多。

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

这将从贪婪地匹配*/的字符串开始删除所有内容。请参见a href="http://wiki.bash hacker.org/syntax/pe">bash hacker wiki条目以了解参数扩展/a a。

如果您只想在最后一个/之前删除所有内容,但不包括它(字面理解您的问题,但通常是一个不太有用的操作),那么您可能需要if [[ $s = */* ]]; then echo"/${s##*/}"; else echo"$s"; fi


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

"print$nf"指示awk打印每行的最后一个字段,并指定fs=/对字段delimeter进行正斜杠。在SED中,您可以做到:

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

它只删除最后一个/之前的所有内容。


曲折,但仅仅是因为我能记住我使用的语法:

cat文件rev cut-d/-f1 rev

剥"猫"皮的方法很多。哎哟。