我有一个文件中的很多文件路径,看起来像这样:
/home/rtz11/files/testfiles/547/prob547455_01
我想使用一个 bash 脚本,将所有的文件名打印到屏幕上,基本上就是最后一个 /
后面的内容。我不想假设它总是相同的长度,因为它可能不是。
是否有一种方法可以删除最后一个 /
之前的所有内容?也许可以用 sed
命令来实现吗?
对于这个问题,使用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
。${PATHNAME%/*}
。 - Asheshawk '{print $NF}' FS=/ input-file
'print $NF'指示awk打印每行的最后一个字段,并将FS=/分配为正斜杠字段分隔符。在sed中,您可以执行以下操作:
sed 's@.*/@@' input-file
这个操作会删除最后一个 /
及之前的所有内容。
@
仅用作分隔符,替换了通常的正斜杠/
。后者不能轻易使用,因为它构成了目标。等效的命令是sed s|.*/||'
或sed 's:.*/::'
。 - Serge Stroobandt我写的代码有些曲折,但只是因为我能记得我使用的语法:
Original Answer翻译成:"最初的回答"
cat file | rev | cut -d/ -f1 | rev
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
> 文件
/
,还是只删除它之前的内容? - Charles Duffy