pengenalan:
Apabila bekerja dengan fail dalam Bash, anda mungkin sering perlu memisahkan nama fail daripada sambungannya. Pendekatan biasa menggunakan perintah `cut`, tetapi kaedah ini boleh gagal dengan nama fail yang mengandungi berbilang noktah.
Sebagai contoh, nama fail seperti `a.b.js` akan dipecahkan secara salah kepada `a` dan `b.js` bukannya `a.b` dan `js`. Walaupun Python menyediakan penyelesaian mudah dengan `os.path.splitext()`, menggunakan Python mungkin tidak selalu menjadi pilihan yang paling cekap. Artikel ini meneroka kaedah yang lebih baik untuk mencapai tugas ini dalam Bash.
Perintah | Penerangan |
---|---|
${variable%.*} | Peluasan parameter untuk mengalih keluar sambungan daripada nama fail. |
${variable##*.} | Peluasan parameter untuk mengekstrak sambungan daripada nama fail. |
awk -F. | Menetapkan pemisah medan kepada noktah, digunakan untuk memisahkan nama fail. |
OFS="." | Pemisah medan keluaran dalam awk, digunakan untuk membina semula nama fail tanpa sambungan. |
NF-- | Mengurangkan bilangan medan sebanyak satu dalam awk, mengalih keluar sambungan dengan berkesan. |
${BASH_REMATCH} | Tatasusunan yang memegang padanan daripada ungkapan biasa dalam Bash. |
local variable | Mengisytiharkan pembolehubah dengan skop setempat dalam fungsi dalam Bash. |
Pecahan Terperinci Penyelesaian Bash
Skrip yang disediakan menawarkan pelbagai kaedah untuk memisahkan nama fail dan sambungannya dalam Bash. Skrip pertama menggunakan pengembangan parameter Bash. Pembolehubah ${FILE%.*} mengalih keluar sambungan dengan menanggalkan segala-galanya daripada tempoh terakhir hingga penghujung rentetan, manakala ${FILE##*.} menangkap sambungan dengan mengambil segala-galanya selepas tempoh terakhir. Kaedah ini mudah dan cekap untuk kebanyakan struktur nama fail. Skrip kedua menggunakan awk, alat pemprosesan teks yang berkuasa dalam persekitaran seperti Unix. Dengan menetapkan pemisah medan kepada noktah menggunakan -F., ia membenarkan pemisahan nama fail kepada bahagian. Pemisah medan keluaran, OFS=".", dan mengurangkan bilangan medan dengan NF-- adalah teknik untuk memasang semula nama fail tanpa sambungannya.
Skrip ketiga menggunakan ungkapan biasa dalam Bash, memanfaatkan ${BASH_REMATCH} untuk menangkap kumpulan dalam perlawanan regex. Skrip ini menggunakan corak yang membahagikan nama fail kepada dua kumpulan: satu untuk nama asas dan satu untuk sambungan. Akhir sekali, skrip fungsi tersuai merangkum logik pengembangan parameter dalam fungsi, meningkatkan kebolehgunaan semula kod dan kebolehbacaan. Ia menggunakan local variable pengisytiharan untuk memastikan pembolehubah dalam skop dalam fungsi, menghalang kesan sampingan yang tidak diingini dalam skrip yang lebih besar. Setiap kaedah menunjukkan pendekatan yang berbeza untuk menyelesaikan masalah yang sama, mempamerkan kepelbagaian dan kuasa skrip Bash.
Menggunakan Pengembangan Parameter dalam Bash
Skrip Bash
#!/bin/bash
# Script to extract filename and extension using parameter expansion
FILE="a.b.js"
FILENAME="${FILE%.*}"
EXTENSION="${FILE##*.}"
echo "Filename: $FILENAME"
echo "Extension: $EXTENSION"
Menggunakan Awk untuk Mengasingkan Nama Fail dan Sambungan
Bash dengan Awk
#!/bin/bash
# Script to extract filename and extension using awk
FILE="a.b.js"
FILENAME=$(echo "$FILE" | awk -F. '{OFS="."; NF--; print $0}')
EXTENSION=$(echo "$FILE" | awk -F. '{print $NF}')
echo "Filename: $FILENAME"
echo "Extension: $EXTENSION"
Menggunakan Ungkapan Biasa dalam Bash
Skrip Bash dengan regex
#!/bin/bash
# Script to extract filename and extension using regex
FILE="a.b.js"
[[ "$FILE" =~ (.*)\.(.*) ]]
FILENAME=${BASH_REMATCH[1]}
EXTENSION=${BASH_REMATCH[2]}
echo "Filename: $FILENAME"
echo "Extension: $EXTENSION"
Menggunakan Fungsi Tersuai dalam Bash
Skrip Bash dengan fungsi tersuai
#!/bin/bash
# Function to extract filename and extension
extract_filename_extension() {
local file="$1"
echo "Filename: ${file%.*}"
echo "Extension: ${file##*.}"
}
# Call the function with a file
extract_filename_extension "a.b.js"
Meneroka Kaedah Alternatif untuk Manipulasi Fail dalam Bash
Di luar kaedah yang telah dibincangkan, terdapat teknik lain yang berguna dalam Bash untuk memanipulasi nama fail dan sambungan. Satu kaedah sedemikian melibatkan penggunaan basename dan dirname arahan. basename boleh digunakan untuk mengekstrak nama fail daripada laluan, manakala dirname mendapatkan semula laluan direktori. Menggabungkan arahan ini dengan pengembangan parameter boleh memisahkan nama fail dan sambungan dengan berkesan. Sebagai contoh, menggunakan basename "$FILE" ".${FILE##*.}" mengalih keluar sambungan daripada nama fail. Pendekatan ini amat berguna apabila bekerja dengan laluan fail penuh dan bukannya hanya nama fail.
Kaedah lain melibatkan penggunaan sed, editor strim yang berkuasa untuk menapis dan mengubah teks. Dengan mencipta ungkapan biasa yang sesuai, sed boleh mengasingkan nama fail dan sambungan. Sebagai contoh, arahan echo "$FILE" | sed 's/\(.*\)\.\(.*\)/\1 \2/' memisahkan nama fail dan sambungan, meletakkannya dalam kumpulan tangkapan berasingan. Teknik ini fleksibel dan boleh mengendalikan struktur nama fail yang kompleks. Meneroka alat dan kaedah tambahan ini mengembangkan keupayaan anda untuk memanipulasi data fail dalam Bash, menyediakan penyelesaian yang mantap untuk pelbagai senario skrip.
Soalan Lazim tentang Manipulasi Fail Bash
- Apakah tujuan ${FILE%.*} perintah?
- Ia mengalih keluar sambungan daripada nama fail dengan menanggalkan segala-galanya selepas tempoh terakhir.
- Bagaimana caranya ${FILE##*.} kerja arahan?
- Ia mengekstrak sambungan dengan mengambil segala-galanya selepas tempoh terakhir dalam nama fail.
- Apakah awk -F. lakukan dalam skrip yang disediakan?
- Ia menetapkan pemisah medan kepada noktah, membenarkan nama fail dibahagikan kepada beberapa bahagian.
- Kenapa guna NF-- dalam sebuah awk skrip?
- Ia mengurangkan bilangan medan dengan satu, dengan berkesan mengalih keluar sambungan daripada nama fail.
- Bagaimanakah ungkapan biasa membantu dalam mengekstrak nama fail dan sambungan?
- Mereka membenarkan padanan corak dan pengelompokan, yang boleh mengasingkan bahagian berlainan nama fail.
- Apakah faedah menggunakan fungsi tersuai dalam Bash?
- Fungsi tersuai meningkatkan kebolehgunaan semula dan kebolehbacaan kod, menjadikan skrip lebih modular.
- Bagaimana basename membantu dengan nama fail?
- Ia mengekstrak nama fail daripada laluan fail penuh, secara pilihan mengalih keluar sambungan.
- boleh sed digunakan untuk manipulasi nama fail?
- ya, sed boleh menggunakan ungkapan biasa untuk mengubah dan mengasingkan bahagian nama fail.
Membungkus Penyelesaian untuk Nama Fail dan Pengekstrakan Sambungan
Kesimpulannya, mengekstrak nama fail dan sambungan dalam Bash boleh dicapai dengan berkesan melalui pelbagai kaedah, setiap satu sesuai dengan keperluan dan pilihan yang berbeza. Sama ada menggunakan pengembangan parameter, awk, sed atau fungsi tersuai, teknik ini menawarkan penyelesaian yang fleksibel dan cekap. Memahami dan menggunakan arahan ini memastikan bahawa skrip boleh mengendalikan nama fail dengan beberapa tempoh dan kerumitan lain tanpa ralat.