Przypisywanie tylko części łańcucha do zmiennej w bash

11

Otrzymuję od użytkownika pewną bezwzględną ścieżkę do pliku i chcę utworzyć zmienną, która będzie ciągiem, który nie będzie zawierał tylko PIERWSZYCH dwóch składników ścieżki pliku, ale nie będzie go drukować ani nic.

Na przykład ścieżka bezwzględna może być:

/home/myusername/folder1/folder2/folder3

I jest zapisany w „ścieżka_docelowa”, i chcę, aby „mój_katalog” był tylko:

/folder1/folder2/folder3

Próbowałem użyć polecenia cięcia na różne sposoby, ale bez powodzenia.

Życie Pi
źródło
Czy /home/usernamerzeczywisty $HOMEkatalog wywołującego użytkownika? jeśli tak, możesz to usunąć po prostu za pomocą mydir="${target_path#$HOME}", myślę
steeldriver

Odpowiedzi:

15

Korzystanie z manipulacji ciągiem bash :

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

Tak więc ciąg, który chciałbyś być (dodając początkowy ukośnik):

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

Dla zmiennej a, ${a#foo}usunie najkrótszą dopasowanie ciąg foood początku dnia a. Tak więc usuwamy najkrótszy ciąg zawierający trzy /(w tym ukośnik na ścieżce), aby usunąć pierwsze dwa elementy ścieżki bezwzględnej.

muru
źródło
Ścieżka może zawierać 30 folderów, a chcę tylko uwzględnić ostatnie 28. Czy to nadal będzie działać?
Życie pi
@Lifeofpi dlaczego nie?
muru
9

Oto przykład użycia cut

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

folder1/folder2/folder3

Jeśli potrzebujesz prowadzenia, /możesz dołączyć | sed 's/^/\//'go na końcu linii.

Potrzebujesz, -f4-ponieważ -d '/'mówi, cutaby użyć /jako separatora między polami. Pierwsze pole znajduje się przed pierwszym ogranicznikiem, w tym przypadku pierwsze pole jest puste. Podobnie folder1jest z czwartym polem i -f4-mówi cut, aby używać wszystkich pól od czwartego.

guntbert
źródło
7

Możesz użyć rozszerzenia parametrów bash w następujący sposób:

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

Po tym:

echo $myvar

daje:

/folder1/folder2/folder3

Działa poprzez usunięcie pierwszego dopasowania wzorca /*/*/ze zmiennej target_path przy użyciu ${target_path#pattern}składni rozszerzenia parametru powłoki. Niestety usuwa to pierwszy /znak, dlatego znak ten musi zostać jawnie dołączony podczas ustawiania zmiennej myvar.

Ostrzeżenie: przed użyciem tej metody należy sprawdzić, czy zmienna target_path zawiera niektóre znaki i jest dłuższa niż dwa segmenty ścieżki. Na przykład jeśli target_path=/home/username/, to myvar=/. Może to być niebezpieczne dla twojego systemu, jeśli używasz czegoś podobnego rm -rf "$myvar"*. Nie próbuj tego!

Arroniczny
źródło
Ścieżka może zawierać 30 folderów, a chcę tylko uwzględnić ostatnie 28. Czy to nadal będzie działać?
Życie pi
Zdecydowanie spowoduje to przycięcie tylko dwóch pierwszych, bez względu na długość ścieżki.
Arronical