Bash kullanıyorsanız, aşağıdakileri bile kullanmanıza gerek yoktur 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
Normal ifadeyi bir değişkene koymak daha iyidir. Bazı desenler kelimenin tam anlamıyla dahil edilirse çalışmaz.
=~
Bash'ın normal ifade eşleştirme operatörü olan bu kullanır . Maçın sonuçları adlı bir diziye kaydedilir $BASH_REMATCH
. İlk yakalama grubu dizin 1'de, ikincisi (varsa) dizin 2'de vb. Saklanır. İndeks sıfır tam eşleşmedir.
Çapa olmadan, bu normal ifadenin (ve kullananın grep
) aşağıdaki örneklerden herhangi biriyle ve daha fazlasıyla eşleşeceğini bilmelisiniz; bu , aradığınız şey olmayabilir:
123_abc_d4e5
xyz123_abc_d4e5
123_abc_d4e5.xyz
xyz123_abc_d4e5.xyz
İkinci ve dördüncü örnekleri ortadan kaldırmak için normal ifadenizi şu şekilde yapın:
^[0-9]+_([a-z]+)_[0-9a-z]*
dizenin bir veya daha fazla basamakla başlaması gerektiğini belirtir . Karat, ipin başlangıcını temsil eder. Normal ifadenin sonuna bir dolar işareti eklerseniz, şöyle:
^[0-9]+_([a-z]+)_[0-9a-z]*$
nokta, normal ifadedeki karakterler arasında olmadığından ve dolar işareti dizenin sonunu temsil ettiğinden üçüncü örnek de ortadan kaldırılır. Dördüncü örneğin de bu eşleşmeyi geçemediğini unutmayın.
GNU'nuz varsa grep
(yaklaşık 2.5 veya üstü, bence, \K
operatör eklendiğinde):
name=$(echo "$f" | grep -Po '(?i)[0-9]+_\K[a-z]+(?=_[0-9a-z]*)').jpg
\K
Operatör (değişken uzunlukta olan ileriye dönük) maça önceki deseni neden olur, ancak sonuç maçı içermez. Sabit uzunluklu eşdeğer (?<=)
- desen, kapanış parantezinden önce dahil edilir. Sen kullanmalıdır \K
nicelik farklı uzunlukta dizeleri eşleşebilir eğer (örneğin +
, *
, {2,4}
).
(?=)
Operatör maçları sabit veya değişken uzunlukta desen ve "ileriye bakma" denir. Sonuçta eşleşen dizeyi de içermez.
Eşleşmeyi büyük / küçük harfe duyarsız hale getirmek için (?i)
operatör kullanılır. Onu takip eden kalıpları etkiler, böylece konumu önemlidir.
Normal adın, dosya adında başka karakterler olup olmadığına bağlı olarak ayarlanması gerekebilir. Bu durumda, alt dizenin yakalandığı sırada bir dizeyi bitiştirmeye bir örnek gösterdiğimi göreceksiniz.