bash: Bagaimana cara menggunakan banyak manipulasi string (perluasan parameter) dalam satu langkah?
Saya memiliki di string=substr1-substr2-substr3.substr4
mana substring memiliki panjang variabel. Saya ingin mengekstrak substr3
dari string
dan 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 result
containg 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 $string
tidak berisi karakter baris baru, Anda dapat menggunakan
IFS=.- read -r a b c d <<< "$string"
dan membaca substr3
off dari c
.
Dalam hal ini, bergantung pada shell dan ukuran string, konten $string
akan disimpan dalam file sementara atau dimasukkan melalui pipa yang read
akan membaca baris pertama dari dan membaginya sesuai $IFS
.