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

11

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

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

/home/myusername/folder1/folder2/folder3

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

/folder1/folder2/folder3

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

Жизнь Пи
источник
Является ли /home/usernameдействительный $HOMEкаталог вызывающего пользователя? если это так, вы можете удалить его, просто используя, mydir="${target_path#$HOME}"я думаю
Steeldriver

Ответы:

15

Использование манипуляции строк в bash :

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

Итак, строка, которую вы хотите, была бы (добавляя обратную косую черту):

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

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

Мур
источник
Путь может быть 30 папок, и я хочу включить только последние 28. Будет ли это работать?
Жизнь пи
@Lifeofpi почему бы и нет?
Муру
9

Вот пример использования cut

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

folder1/folder2/folder3

Если вам нужен ведущий, /вы можете добавить | sed 's/^/\//'в конец своей линии.

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

guntbert
источник
7

Вы можете использовать расширение параметров bash следующим образом:

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"*. Не пытайся это!

Arronical
источник
Путь может быть 30 папок, и я хочу включить только последние 28. Будет ли это работать?
Жизнь пи
Определенно, это обрезает только первые два, независимо от длины пути.
Arronical