bash: Bagaimana cara menggunakan banyak manipulasi string (perluasan parameter) dalam satu langkah?
Saya memiliki di string=substr1-substr2-substr3.substr4mana substring memiliki panjang variabel. Saya ingin mengekstrak substr3dari stringdan saya berpikir untuk melakukannya menggunakan ekspansi manipulasi string ${string##pattern}dan ${string%pattern}. Dengan menggunakan pendekatan ini, jelas saya perlu menjalankan ${string##*-}dan menjalankan ${string%.*}ekspansi yang dihasilkan, atau sebaliknya. Pertanyaan saya adalah:
- apakah ini pilihan terbaik?
- Jika ya, bagaimana cara menjalankan keduanya dalam satu langkah? Ketika saya mencoba melakukan sesuatu seperti
${string##*-${string%.*}}atau${string%.*${string##*-}}saya hanya mendapatkan kembali seluruh string. Saya menyadari bahwa saya selalu dapat melakukan ekstraksi dalam dua langkah dengan menetapkan variabel perantara ke hasil langkah pertama, dan kemudian memanipulasinya; tapi saya ingin melakukannya dalam satu langkah. Bagaimana saya melakukannya?
TIA!
Jawaban
Diberikan
string=substr1-substr2-substr3.substr4
${string%.*} adalah
substr1-substr2-substr3
jadi, ${string##*-${string%.*}}adalah
${string##*-substr1-substr2-substr3}
yang berarti menghapus dari awal string, semuanya hingga dan termasuk -substr1-substr2-substr3. Tetapi tidak ada substring seperti itu string, karena tidak ada tanda hubung di depannya substr1, jadi Anda mendapatkan string aslinya.
Apa yang mungkin Anda inginkan adalah
string=substr1-substr2-substr3.substr4
result="${string%.*}" result="${result##*-}"
yang mengarah ke resultcontaing substr3.
Di Zsh, Anda dapat melakukannya dalam satu langkah:, tetapi itu tidak berhasil di Bash.result=${${string%.*}##*-}
Di Bash, Anda dibatasi untuk menggunakan ekspansi di sisi kanan #atau %, dan itu tidak membantu Anda di sini karena Anda perlu menghapus bagian dari awal dan akhir string.
Alternatifnya, jika $stringtidak berisi karakter baris baru, Anda dapat menggunakan
IFS=.- read -r a b c d <<< "$string"
dan membaca substr3off dari c.
Dalam hal ini, bergantung pada shell dan ukuran string, konten $stringakan disimpan dalam file sementara atau dimasukkan melalui pipa yang readakan membaca baris pertama dari dan membaginya sesuai $IFS.