Menetapkan hanya sebagian string ke variabel dalam bash

11

Saya terima dari pengguna sebuah filepath mutlak tertentu, dan saya ingin membuat variabel yang akan menjadi string yang tidak akan hanya menyertakan PERTAMA dua komponen path file, tapi tanpa mencetaknya atau apa.

Misalnya, jalur absolut dapat berupa:

/home/myusername/folder1/folder2/folder3

Dan itu disimpan di "target_path", dan saya hanya ingin "mydir":

/folder1/folder2/folder3

Saya mencoba menggunakan perintah cut dengan cara yang berbeda tetapi tidak berhasil.

Kehidupan pi
sumber
Apakah direktori /home/usernamesebenarnya $HOMEdari pengguna yang memohon? jika demikian Anda bisa menghapusnya hanya menggunakan mydir="${target_path#$HOME}"saya pikir
steeldriver

Jawaban:

15

Menggunakan manipulasi string bash :

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

Jadi, string yang Anda inginkan adalah (menambahkan kembali garis miring terkemuka):

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

Untuk variabel a, ${a#foo}akan menghapus string matching terpendek foodari awal dari a. Jadi, kami menghapus string terpendek yang mengandung tiga /(termasuk garis miring di jalur), untuk menghapus dua komponen pertama dari jalur absolut.

muru
sumber
Path mungkin 30 folder, dan saya hanya ingin memasukkan 28 folder terakhir. Apakah ini masih berfungsi?
Kehidupan pi
@Lifeofpi kenapa tidak?
muru
9

Berikut ini adalah contoh menggunakan cut

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

folder1/folder2/folder3

Jika Anda memerlukan arahan, /Anda dapat menambahkan | sed 's/^/\//'ke akhir baris Anda.

Anda perlu -f4-karena -d '/'memberitahu cutuntuk digunakan /sebagai pembatas antar bidang. Jadi bidang pertama muncul sebelum pembatas pertama, dalam hal ini bidang pertama kosong. Begitu folder1juga bidang ke-4 dan -f4-memberi tahu cut untuk menggunakan semua bidang dari tanggal 4 dan seterusnya.

Guntbert
sumber
7

Anda dapat menggunakan ekspansi parameter bash seperti:

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

Sesudah ini:

echo $myvar

memberi:

/folder1/folder2/folder3

Ini bekerja dengan menghapus kecocokan pertama dari pola /*/*/dari variabel target_path Anda, dengan menggunakan ${target_path#pattern}sintaks ekspansi parameter shell. Sayangnya ini menghapus /karakter pertama , itulah sebabnya karakter itu harus dimasukkan secara eksplisit saat mengatur variabel myvar.

Peringatan: Anda harus memeriksa bahwa variabel target_path Anda berisi beberapa karakter, dan lebih panjang dari dua segmen jalur sebelum menggunakan metode ini. Misalnya target_path=/home/username/, jika myvar=/. Ini bisa berbahaya bagi sistem Anda jika Anda menjalankan sesuatu seperti rm -rf "$myvar"*. Jangan coba ini!

Arronikal
sumber
Path mungkin 30 folder, dan saya hanya ingin memasukkan 28 folder terakhir. Apakah ini masih berfungsi?
Kehidupan pi
Jelas, ini hanya akan memotong dua yang pertama, tidak peduli berapa panjang jalannya.
Arronical