我在文件中有很多文件路径,如下所示:
/home/rtz11/files/testfiles/547/prob547455_01
我想使用一个bash脚本,它只会将所有文件名打印到屏幕上。所以基本上是在最后/
之后。我不想假设它总是相同的长度,因为它可能不是。有没有办法在最后/
之前删除所有内容?也许是sed
命令?任何帮助将不胜感激!
答案 0 :(得分:25)
使用sed
是非常过分的 - bash内置了大量的字符串操作,并且只使用一行时使用这种内置支持效率更高。
s=/home/rtz11/files/testfiles/547/prob547455_01
basename="${s##*/}"
echo "$basename"
这将从字符串的开头删除贪婪匹配*/
的所有内容。请参阅the bash-hackers wiki entry for parameter expansion。
如果您只想删除之前最后/
之前的所有内容,但不包括它(您的问题的字面读取,但通常不太有用的操作),您可能而是想要if [[ $s = */* ]]; then echo "/${s##*/}"; else echo "$s"; fi
。
答案 1 :(得分:11)
awk '{print $NF}' FS=/ input-file
'print $ NF'指示awk打印每一行的最后一个字段,并指定FS = /使正斜率字段除去。在sed中,您可以这样做:
sed 's@.*/@@' input-file
只删除所有内容,包括最后一个/
。
答案 2 :(得分:0)
曲折,但仅仅是因为我记得我使用的语法:
cat文件|转速|切-d / -f1 |转速
有很多方法可以给“猫”换皮。哎呀。
答案 3 :(得分:0)
另一种方式:
使用基本名称可执行文件(命令):
basename /path/with/many/slashes/and/file.extension
>file.extension
basename /path/with/many/slashes/and/file.extension .extension
OR
basename -s .extension /path/with/many/slashes/and/file.extension
> file