Jika Anda menggunakan Bash, Anda bahkan tidak perlu menggunakan grep
:
files="*.jpg"
regex="[0-9]+_([a-z]+)_[0-9a-z]*"
for f in $files # unquoted in order to allow the glob to expand
do
if [[ $f =~ $regex ]]
then
name="${BASH_REMATCH[1]}"
echo "${name}.jpg" # concatenate strings
name="${name}.jpg" # same thing stored in a variable
else
echo "$f doesn't match" >&2 # this could get noisy if there are a lot of non-matching files
fi
done
Lebih baik menempatkan regex dalam sebuah variabel. Beberapa pola tidak akan berfungsi jika dimasukkan secara harfiah.
Ini menggunakan =~
yang merupakan operator pertandingan regex Bash. Hasil pertandingan disimpan ke array yang disebut $BASH_REMATCH
. Grup tangkapan pertama disimpan dalam indeks 1, yang kedua (jika ada) dalam indeks 2, dll. Indeks nol adalah kecocokan penuh.
Anda harus menyadari bahwa tanpa jangkar, regex ini (dan yang menggunakan grep
) akan cocok dengan salah satu contoh berikut dan lebih banyak lagi, yang mungkin bukan yang Anda cari:
123_abc_d4e5
xyz123_abc_d4e5
123_abc_d4e5.xyz
xyz123_abc_d4e5.xyz
Untuk menghilangkan contoh kedua dan keempat, buat regex Anda seperti ini:
^[0-9]+_([a-z]+)_[0-9a-z]*
yang mengatakan string harus dimulai dengan satu digit atau lebih. Karat mewakili awal dari string. Jika Anda menambahkan tanda dolar di akhir regex, seperti ini:
^[0-9]+_([a-z]+)_[0-9a-z]*$
maka contoh ketiga juga akan dihilangkan karena titik tidak ada di antara karakter di regex dan tanda dolar mewakili akhir dari string. Perhatikan bahwa contoh keempat juga gagal dalam pertandingan ini.
Jika Anda memiliki GNU grep
(sekitar 2,5 atau lebih baru, saya pikir, ketika \K
operator ditambahkan):
name=$(echo "$f" | grep -Po '(?i)[0-9]+_\K[a-z]+(?=_[0-9a-z]*)').jpg
The \K
operator (variable-length lihat-balik) menyebabkan pola sebelumnya untuk pertandingan, tetapi tidak termasuk pertandingan dalam hasil. Persamaan panjang tetap adalah (?<=)
- pola akan dimasukkan sebelum tanda kurung tutup. Anda harus menggunakan \K
jika bilangan dapat mencocokkan string panjang yang berbeda (misalnya +
, *
, {2,4}
).
The (?=)
pertandingan operator fixed atau pola variabel-panjang dan disebut "tampak-depan". Itu juga tidak termasuk string yang cocok dalam hasil.
Untuk membuat korek api tidak peka, (?i)
operator digunakan. Ini mempengaruhi pola yang mengikutinya sehingga posisinya signifikan.
Regex mungkin perlu disesuaikan tergantung pada apakah ada karakter lain dalam nama file. Anda akan perhatikan bahwa dalam kasus ini, saya menunjukkan contoh menggabungkan string pada saat yang sama ketika substring ditangkap.