Я получаю от пользователя определенный абсолютный путь к файлу и хочу создать переменную, которая будет строкой, которая не будет включать в себя только ПЕРВЫЕ два компонента пути к файлу, но без ее печати или чего-либо еще.
Например, абсолютный путь может быть:
/home/myusername/folder1/folder2/folder3
И он сохраняется в «target_path», и я хочу, чтобы «mydir» был только:
/folder1/folder2/folder3
Я пытался использовать команду cut по-разному, но безуспешно.
command-line
bash
environment-variables
Жизнь Пи
источник
источник
/home/username
действительный$HOME
каталог вызывающего пользователя? если это так, вы можете удалить его, просто используя,mydir="${target_path#$HOME}"
я думаюОтветы:
Использование манипуляции строк в bash :
Итак, строка, которую вы хотите, была бы (добавляя обратную косую черту):
Для переменной
a
,${a#foo}
приведет к удалению самой короткой строки согласованияfoo
с начала изa
. Итак, мы удаляем самую короткую строку, содержащую три/
(включая косую черту в пути), чтобы удалить первые два компонента абсолютного пути.источник
Вот пример использования
cut
Если вам нужен ведущий,
/
вы можете добавить| sed 's/^/\//'
в конец своей линии.Вам нужно,
-f4-
потому что-d '/'
говоритcut
использовать/
в качестве разделителя между полями. Таким образом, первое поле стоит перед первым разделителем, в этом случае первое поле пустое. Тоfolder1
же самое относится и к 4-му полю и-f4-
указывает cut использовать все поля с 4-го числа и далее.источник
Вы можете использовать расширение параметров bash следующим образом:
После этого:
дает:
Он работает путем удаления первого совпадения шаблона
/*/*/
из переменной target_path, используя${target_path#pattern}
синтаксис расширения параметров оболочки. К сожалению, это удаляет первый/
символ, поэтому этот символ должен быть явно включен при установке переменной myvar.Предупреждение: перед использованием этого метода вы должны убедиться, что ваша переменная target_path содержит несколько символов и имеет длину более двух сегментов пути. Например, если
target_path=/home/username/
тогдаmyvar=/
. Это может быть опасно для вашей системы, если вы используете что-то вродеrm -rf "$myvar"*
. Не пытайся это!источник