在bash之前/之前删除所有内容

时间:2015-04-21 01:18:53

标签: bash unix sed scripting

我在文件中有很多文件路径,如下所示:

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

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

4 个答案:

答案 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