bash: Bagaimana cara menggunakan banyak manipulasi string (perluasan parameter) dalam satu langkah?

Aug 15 2020

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:

  1. apakah ini pilihan terbaik?
  2. 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

2 ilkkachu Aug 15 2020 at 20:39

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.