Как получить первую и вторую части строки в bash при последнем вхождении разделителя

#bash

#bash

Вопрос:

Мне нужно разделить строку при последнем вхождении разделителя и разделить обе части на две переменные.

Ввод может быть

 - stringOne_One/stringOne_Two/stingOne_Three
- stringTwo_One/stringTwo_Two
 

Я хочу разделить строку при последнем вхождении разделителя «/» и получить как первую, так и последнюю часть строки на две переменные.

Для первого примера вывод должен быть

 var1=stringOne_One/stringOne_Two
var2=stringOne_Three
 

Для второго примера вывод должен быть

 var1=stringTwo_One
var2=stringTwo_Two
 

Как мне это сделать в bash. Предпочел бы решение с использованием AWK, но любой другой метод также приемлем.

Комментарии:

1. Мы призываем спрашивающих показать, что они пытались до сих пор, чтобы решить проблему самостоятельно.

2. @Cyrus: Извините за это. Будем иметь это в виду в будущем.

Ответ №1:

Используйте dirname и basename тому подобное:

 my_var='stringOne_One/stringOne_Two/stingOne_Three'

var1=$(basename $my_var)
# stingOne_Three

var2=$(dirname $my_var)
# stringOne_One/stringOne_Two
 

Комментарии:

1. Принят ответ @markp-fuso, поскольку он может быть расширен и для других разделителей.

Ответ №2:

С bash помощью и регулярного выражения:

 string='stringOne_One/stringOne_Two/stingOne_Three'

[[ "$string" =~ (.*)/(.*) ]]
var1="${BASH_REMATCH[1]}"
var2="${BASH_REMATCH[2]}"
 

Ответ №3:

Использование расширения параметров:

 $ x="stringOne_One/stringOne_Two/stingOne_Three"
$ var1="${x%/*}"
$ var2="${x##*/}"
$ echo "${var1} : ${var2}"
stringOne_One/stringOne_Two : stingOne_Three

$ x="stringTwo_One/stringTwo_Two"
$ var1="${x%/*}"
$ var2="${x##*/}"
$ echo "${var1} : ${var2}"
stringTwo_One : stringTwo_Two