Delete everything before last / in bash

后端 未结 4 2080
无人共我
无人共我 2021-01-04 22:48

I have many file paths in a file that look like so:

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

I want to use a bash script that will pri

相关标签:
4条回答
  • 2021-01-04 23:29

    Meandering but simply because I can remember the syntax I use:

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

    Many ways to skin a 'cat'. Ouch.

    0 讨论(0)
  • 2021-01-04 23:30
    awk '{print $NF}' FS=/ input-file
    

    The 'print $NF' directs awk to print the last field of each line, and assigning FS=/ makes forward slash the field delimeter. In sed, you could do:

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

    which simply deletes everything up to and including the last /.

    0 讨论(0)
  • 2021-01-04 23:40

    One more way:

    Use the basename executable (command):

    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

    0 讨论(0)
  • 2021-01-04 23:45

    Using sed for this is vast overkill -- bash has extensive string manipulation built in, and using this built-in support is far more efficient when operating on only a single line.

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

    This will remove everything from the beginning of the string greedily matching */. See the bash-hackers wiki entry for parameter expansion.


    If you only want to remove everything prior to the last /, but not including it (a literal reading of your question, but also a generally less useful operation), you might instead want if [[ $s = */* ]]; then echo "/${s##*/}"; else echo "$s"; fi.

    0 讨论(0)
提交回复
热议问题