Bash / zsh: получить подстроку из последнего совпадения в строке - PullRequest
1 голос
/ 06 мая 2011

В сценарии оболочки у меня есть переменная $PATH, которая может выглядеть так: /foo8232/test874-ab/bar/test-82-x. Теперь я хочу получить подстроку этого, получив в результате test-82-x в данном конкретном случае.

Таким образом, я должен сопоставить вхождения /test.*, но только последний элемент ИЛИ с конца строки. Все, что работает лучше всего.

Любая помощь в этом?

Edit: Спасибо за столь быстрое решение. Некоторые из них не работают, хотя. Не уверен, но, возможно, проблема в том, что мой путь на самом деле имеет пробелы и выглядит следующим образом: /foo12323/test34 - 343bar/test - 234/test - 4323.txt. Извините, что я не упомянул об этом в первую очередь, если это вызывает проблемы.

Ответы [ 5 ]

4 голосов
/ 06 мая 2011

Для вашего конкретного управления путями у вас есть функция basename:

basename /foo8232/test874-ab/bar/test-82-x
>>> test-82-x

или в сценарии:

#!/bin/bash
fullfilename=$(basename $1)
extension=${fullfilename##*.}
filename=${fullfilename%.*}

echo "fullfilename=$fullfilename"
echo "extension=$extension"
echo "filename=$filename"

, которая дает:

./file_name.sh /foo8232/test874-ab/bar/test-82-x
fullfilename=test-82-x
extension=
filename=test-82-x
1 голос
/ 06 мая 2011

Последний элемент пути, содержащий test, также может быть найден с sed:

elem=$(echo $PATH | sed -r 's#.*/(test[^/]*).*#\1#')

или без -r (с использованием расширенных регулярных выражений):

elem=$(echo $PATH | sed 's#.*/\(test[^/]*\).*#\1#')
1 голос
/ 06 мая 2011

Следующее должно быть POSIX-совместимым

BASE=$(basename $PATH)
if echo $BASE | grep "^test.*" > /dev/null; then
  # do something awesome
fi
1 голос
/ 06 мая 2011

Итак, вы ищете последний компонент каталога, который начинается с test.

Как насчет

IFS=/
for dir in $PATH; do
    case $dir in test*)
        match=$dir;;
    esac
done
0 голосов
/ 06 мая 2011

эхо pwd | awk -F \ / '{print $ NF}' | grep test

...