Misalkan saya memiliki daftar file csv dengan format berikut:
INT_V1_<Product>_<ID>_<Name>_<ddmmyy>.csv
ASG_B1_V1_<Product>_<ID>_<Name>_<ddmmyy>.csv
The INT_V1_ & ASG_B1_V1_ adalah tetap, yang berarti semua file csv mulai dengan itu.
Bagaimana saya bisa membagi nama file menjadi variabel?
Misalnya, saya ingin menangkap Nama & menetapkannya ke variabel $Name
.
Jawaban:
Dengan
zsh
:Dengan
bash
emulasi sh 4.3 atau lebih baru, ksh93t atau lebih baru atau zsh (meskipun dalamzsh
, Anda lebih suka melakukanfield=("${(@s:_:)field}")
pemisahan daripada menggunakan operator split + glob non-sensesh
) Anda dapat membagi string pada_
karakter dan merujuknya dari akhir :Atau (kurang lebih 3,2 atau lebih baru):
(yang mengasumsikan
$file
berisi teks yang valid di lokal saat ini yang tidak dijamin untuk nama file kecuali jika Anda memperbaiki lokal ke C atau lokal lainnya dengan satu byte per karakter karakter).Seperti
zsh
di*
atas,.*
itu serakah . Jadi yang pertama akan makan sebanyak*_
mungkin, jadi sisanya.*
hanya akan cocok dengan_
string gratis.Dengan
ksh93
, Anda bisa melakukannyaDalam POSIX
sh
skrip, Anda bisa menggunakan${var#pattern}
,${var%pattern}
operator ekspansi parameter standar:Atau gunakan lagi operator split + glob:
sumber
ksh: file: 0403-046 The specified subscript cannot be greater than 4095.
untuk${field[-1]}
atau apa pun dalam formulir${x[n]}
.${field[-1]}
adalah untukbash-4.3+
. Untukksh
, gunakan salah satu dari solusi "POSIX". Dukungan untuk subskrip negatif tidak ditambahkan sebelum ksh93t (fitur yang berasal dari zsh).Anda bisa mengambil nilai bidang Anda
<Name>
dengan perintah ini:(atau dengan
awk
):Dan Anda dapat menempatkan mereka dalam variabel seperti ini:
atau
Tidak jelas dalam pertanyaan apakah Anda menginginkan variabel yang sama untuk semua nilai atau satu variabel tunggal untuk masing-masingnya.
sumber
sumber
_
tidak spesial dan tidak perlu dikutip. Itu mengasumsikan nama file tidak mengandung karakter baris baru. Anda mungkin ingin menambahkan-d ''
.