Я принимаю некоторые отзывы пользователей и проверяю их.
Пример:
$HOME/Documents/test/one.txt
Я принимаю указанную выше строку в качестве входных данных и хочу извлечь ее one.txt
. Мне нужно продолжить работу one.txt
.
решение1
@Jordanm уже дал вам канонический ответ, который работает для любой строки. Если вы имеете дело конкретно с путями, вы также можете использовать программы basename
и dirname
:
basename - strip directory and suffix from filenames
dirname - strip last component from file name
Например:
$ file="$HOME/Documents/test/one.txt"
$ dir=$(dirname "$file");
$ name=$(basename "$file");
$ echo "The file called $name is in the directory $dir"
The file called one.txt is in the directory /home/terdon/Documents/test
решение2
Это обычная задача, с которой может справитьсярасширение параметрав любой оболочке POSIX.
path=$HOME/Documents/test/one.txt
file=${path##*/} # file contains one.txt
Другим распространенным методом является использование программы basename.
file=$(basename "$path")
Единственный недостаток — необходимость порождать внешнюю программу. Главное преимущество — она правильно обрабатывает пути с конечным /
.
решение3
Если вы делаете это с именами файлов, используйте basename
команду:
$ basename $HOME/Documents/test/one.txt
one.txt
Дальше:
$ FILE=$(basename basename $HOME/Documents/test/one.txt)
$ echo $FILE
one.txt
Если вам нужно разделить произвольные строки с произвольными разделителями, это немного магии. Считайте строку в массив и установите разделитель поля ввода на разделитель.
Вот пример:
$ IFS='/' read -a my_array <<< "$HOME/Documents/test/one.txt"
$ ARRAY_LENGTH=$(( ${#my_array[@]} - 1 ))
$ echo "${my_array[$ARRAY_LENGTH]}"
one.txt