Saya mencoba untuk menulis script bash yang berisi fungsi sehingga ketika diberi .tar
, .tar.bz2
, .tar.gz
dll file yang menggunakan tar dengan switch yang relevan untuk dekompresi file.
Saya menggunakan if elif lalu pernyataan yang menguji nama file untuk melihat apa yang berakhir dengan dan saya tidak bisa mencocokkan dengan menggunakan regach metacharacters.
Untuk menyimpan secara konstan penulisan ulang skrip yang saya gunakan 'test' di baris perintah, saya pikir pernyataan di bawah ini akan berfungsi, saya telah mencoba setiap kombinasi tanda kurung, kutipan, dan metacharat yang mungkin dan masih gagal.
test sed-4.2.2.tar.bz2 = tar\.bz2$; echo $?
(this returns 1, false)
Saya yakin masalahnya adalah yang sederhana dan saya telah mencari kemana-mana, namun saya tidak dapat mengerti bagaimana melakukannya. Apakah ada yang tahu bagaimana saya bisa melakukan ini?
check="^a.*c$";if [[ "abc" =~ $check ]];then echo match;fi
kita perlu menyimpan regex pada var[[ sed-4.2.2.tar.bz2 == "*tar.bz2" ]]
tidak akan berfungsi.[[ ! foo =~ bar ]]
.-n 1
parameter, juga tidak membuatnya secara otomatis ke dalam$REPLY
variabel. Awas!Fungsi Untuk Melakukan Ini
Catatan lain
Menanggapi Aquarius Power dalam komentar di atas,
We need to store the regex on a var
Variabel BASH_REMATCH diatur setelah Anda mencocokkan ekspresi, dan $ {BASH_REMATCH [n]} akan cocok dengan grup ke-n yang dibungkus dengan tanda kurung, yaitu sebagai berikut
${BASH_REMATCH[1]} = "compressed"
dan${BASH_REMATCH[2]} = ".gz"
(Regex di atas tidak dimaksudkan untuk menjadi valid untuk penamaan file dan ekstensi, tetapi berfungsi sebagai contoh)
sumber
a
pada GNU tar ataup
pada BSD tar untuk secara eksplisit mengatakannya untuk secara otomatis menyimpulkan tipe kompresi dari ekstensi. GNU tar tidak akan melakukannya secara otomatis jika tidak, dan saya menduga dari komentar @GoodPerson bahwa tar BSD melakukannya secara default.Saya tidak punya cukup perwakilan untuk berkomentar di sini, jadi saya mengirimkan jawaban baru untuk memperbaiki jawaban dogbane. Titik . di regexp
[[ sed-4.2.2.tar.bz2 =~ tar.bz2$ ]] && echo matched
akan benar-benar cocok dengan karakter apa pun, tidak hanya titik literal antara 'tar.bz2', misalnya
atau apa pun yang tidak mengharuskan melarikan diri dengan '\'. Sintaks yang ketat seharusnya
atau Anda bisa lebih cepat dan juga memasukkan titik sebelumnya di regex:
sumber
Karena Anda menggunakan bash, Anda tidak perlu membuat proses anak untuk melakukan ini. Berikut adalah salah satu solusi yang melakukannya sepenuhnya dalam bash:
Penjelasan: Grup sebelum dan sesudah urutan "titik dua dan satu atau lebih spasi" disimpan oleh operator pencocokan pola dalam array BASH_REMATCH.
sumber
Bekerja untukku!
GNU bash, version 4.3.11(1)-release (x86_64-pc-linux-gnu)
sumber
[[ ... ]]
, pola rhs glob tidak berkembang sesuai dengan direktori saat ini, seperti biasanya.[[...]]
, Bash tidak melakukan ekspansi nama file. Dalam manual bash,Word splitting and filename expansion are not performed on the words between the [[ and ]];
shopt -s nocasematch
sumber