Присвоение только части строки к переменной в ударе

Я получаю от пользователя определенный абсолютный filepath, и я хочу создать переменную, которая будет строкой, которая не будет включать только ПЕРВЫЕ два компонента пути к файлу, но не печатая его или чего-либо.

Например, полный путь мог быть:

/home/myusername/folder1/folder2/folder3

И это сохраняется в "target_path", и я хочу, чтобы "mydir" был только:

/folder1/folder2/folder3

Я пытался использовать команду сокращения по-разному, но без успеха.

11
задан 10 November 2016 в 06:56

3 ответа

Используя обработка строк удара :

$ a=/home/myusername/folder1/folder2/folder3
$ echo "${a#/*/*/}"
folder1/folder2/folder3

Так, строка, которую Вы хотите, была бы (добавляющий назад ведущую наклонную черту):

b="/${a#/*/*/}"

Для переменной a, ${a#foo} удалит самое короткое сопоставление строк foo из эти , запускаются из a. Так, мы удаляем самую короткую строку, содержащую три / (включая ведущую наклонную черту в пути), для удаления первых двух компонентов полного пути.

15
ответ дан 23 November 2019 в 03:52

Вот пример с помощью cut

echo "/home/myusername/folder1/folder2/folder3" | cut -d '/' -f4- 

folder1/folder2/folder3

при необходимости в продвижении /, Вы могли бы добавить | sed 's/^/\//' в конец Вашей строки.

Вам нужно -f4-, потому что -d '/' говорит cut использовать / в качестве разделителя между полями. Таким образом, первое поле прибывает перед первым разделителем в этом случае первое поле пусто. Так folder1 4-е поле, и -f4- говорит сокращению использовать все поля от 4-го вперед.

9
ответ дан 23 November 2019 в 03:52

Можно использовать расширение параметра удара как так:

target_path=/home/username/folder1/folder2/folder3
myvar="/${target_path#/*/*/}"

После этого:

echo $myvar

дает:

/folder1/folder2/folder3

Это работает путем удаления первого соответствия шаблона /*/*/ от target_path переменной, при помощи ${target_path#pattern} синтаксис расширения параметра оболочки. К сожалению, это удаляет первое / символ, который является, почему тот символ должен быть явно включен при установке myvar переменной.

Предупреждение: необходимо проверить, что target_path переменная содержит некоторые символы и является дольше, чем двумя сегментами контура перед использованием этого метода. Например, если target_path=/home/username/, то myvar=/. Это могло быть опасно для Вашей системы при выполнении чего-то как rm -rf "$myvar"*. не пробуют это!

7
ответ дан 23 November 2019 в 03:52

Другие вопросы по тегам:

Похожие вопросы: