Призначення лише частини рядка змінній у 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-го далі.


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"*. Не спробуйте цього!


Шлях може містити 30 папок, і я хочу включити лише останні 28. Чи це все ще працюватиме?
Життя пі

Однозначно, це обріже лише перші два, незалежно від довжини шляху.
Арронічний
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.