Bir dizginin yalnızca bir kısmını bash içindeki bir değişkene atama


11

Kullanıcıdan belirli bir mutlak dosya yolu alıyorum ve dosya yolunun yalnızca İLK iki bileşenini içermeyen, ancak herhangi bir şey yazdırmadan bir dize olacak bir değişken oluşturmak istiyorum .

Örneğin, mutlak yol şunlar olabilir:

/home/myusername/folder1/folder2/folder3

Ve bu "target_path" kaydedilir ve "mydir" sadece olmasını istiyorum:

/folder1/folder2/folder3

Cut komutunu farklı şekillerde kullanmayı denedim ama başarılı olamadım.


/home/usernamegerçek $HOMEçağırarak kullanıcı dizini? eğer öyleyse sadece mydir="${target_path#$HOME}"bence kullanarak kaldırabilirsiniz
steeldriver

Yanıtlar:


15

Bash dizesinin manipülasyonunu kullanma :

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

Yani, istediğiniz dize (baştaki eğik çizgiyi geri ekleyerek) olurdu:

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

Bir değişken için a, ${a#foo}en kısa dize eşleme kaldıracaktır foogelen başlangıcı arasında a. Bu nedenle, /mutlak yolun ilk iki bileşenini kaldırmak için üç (yoldaki baştaki eğik çizgi dahil) içeren en kısa dizeyi kaldırırız.


Yol 30 klasör olabilir ve yalnızca son 28'i eklemek istiyorum. Bu yine de çalışır mı?
hayatı

@Lifeofpi neden olmasın?
muru

9

İşte bir örnek cut

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

folder1/folder2/folder3

Eğer öncüye ihtiyacınız varsa , hattınızın sonuna /ekleyebilirsiniz | sed 's/^/\//'.

İhtiyacınız var -f4-çünkü alanlar arasında bir sınırlayıcı olarak kullanılmasını -d '/'söylüyor . Böylece ilk alan ilk sınırlayıcıdan önce gelir, bu durumda ilk alan boştur. Yani 4 alandır ve sonrası 4. tüm alanları kullanmak kesti söyler.cut/folder1-f4-


7

Bash parametre genişletmesini şu şekilde kullanabilirsiniz:

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

Bundan sonra:

echo $myvar

verir:

/folder1/folder2/folder3

Kabuk parametresi genişletme sözdizimini /*/*/kullanarak, desenin ilk eşleşmesini target_path değişkeninizden kaldırarak çalışır ${target_path#pattern}. Ne yazık ki bu ilk /karakteri kaldırır , bu yüzden myvar değişkenini ayarlarken bu karakterin açıkça dahil edilmesi gerekir.

Uyarı: Bu yöntemi kullanmadan önce target_path değişkeninizin bazı karakterler içerdiğini ve iki yol segmentinden uzun olup olmadığını kontrol etmelisiniz. Örneğin target_path=/home/username/, öyleyse myvar=/. Böyle bir şey çalıştırıyorsanız, sisteminiz için tehlikeli olabilir rm -rf "$myvar"*. Bunu deneme!


Yol 30 klasör olabilir ve yalnızca son 28'i eklemek istiyorum. Bu yine de çalışır mı?
hayatı

Kesinlikle, bu yolun uzunluğu ne olursa olsun sadece ilk ikisini keser.
Arronical
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.