Normal İfadeler ile bir dizindeki dosya adlarını kontrol etme


5

Bir dizinin içindeki dosyaların bir listesine sahibim ve içindeki her dosya adının bu sözdizimine sahip olup olmadığını kontrol etmek için normal bir ifade kullanan bir bash betiği yapmak istiyorum:

xxxx_xxxx_xx_xx

Burada x sayılardır.

Düzenleme: Sadece regex ile ihtiyacım var

Yanıtlar:


8

Peki ya

#/usr/bin/env bash
for f in *
do
  [[ $f =~ [0-9]{4}_[0-9]{4}_[0-9]{2}_[0-9]{2} ]] || 
    echo "File $f does not match"
done

Normal ifade herhangi bir rakamı ( [0-9]) kontrol eder . Kıvrımlı parantez içindeki sayılar tekrar sayısıdır, bu nedenle [0-9]{4}4 basamakla eşleşir.

Bunun için bash kullanmamanızı, onun yerine bulmanızı tavsiye ederim. Muhtemelen daha hızlı olacak ve kesinlikle daha taşınabilir (kabukları normal ifadelerle başa çıkamaz):

find -regextype posix-egrep -not -regex '\./[0-9]{4}_[0-9]{4}_[0-9]{2}_[0-9]{2}'

findKomutunuzun bozulmasına neden olan bir senaryo oluşturamıyorum , ancak yine de (genel prensiplere göre) regex'in emniyet için kote olması gerektiğine inanıyorum.
Scott,

@Scott Böyle bir ihtiyati alıntı ile aynı fikirdeyim ama bunun için boğulacak herhangi bir kabuk bilmiyorum. Yine de dediğin gibi, özür dilemekten daha iyi. Tırnak eklendi.
terdon

Tamam, n + 1. kafein enjeksiyonu yaptım ve çözdüm. Bu başlı başına , boğulma sorunu değil . Şu anki dizinde şu gibi bir isim 5{4}_3{4}_0{2}_9{2}varsa (ve kabuk topaklanma işleminiz kapalı değilse), o zaman \./[0-9]{4}_[0-9]{4}_[0-9]{2}_[0-9]{2}(regex'iniz) genişler ./5{4}_3{4}_0{2}_9{2}ve findsadece eşleşir ./5555_3333_00_99(varsa). …… (BTW, 5309, Jenny'nin telefon numarasının son dört basamağıdır.)
Scott

@Scott ah, evet, iyi bulundu! Jenny kim? Yoksa sormamalı mıyım?
terdon

Ciddi anlamda? Ah anlıyorum; Öncelikle İngilizce konuşulan bir ülkede yaşamıyorsunuz. Hadi bakalım.
Scott

1

Zor, ama bu çok taşınabilir olmalı:

#! / Bin / sh
x için *
yap
    durumda "$ x"
        [0-9] [0-9] [0-9] [0-9] _ [0-9] [0-9] [0-9] [0-9] _ [0-9] [0- 9] _ [0-9] [0-9])
            echo "$ x eşleşme"
            ;;
        *)
            echo "$ x eşleşmiyor"
    esac
tamam
#                        Ve can sıkıcı bir şekilde tamamlamak için,
x girişi için. *
yap
    echo "$ x eşleşmiyor"
tamam

Ben kullanılan regex, btw @ terdon tarafından sağlanan çözüm temiz olduğunu düşünüyorum. Yine de teşekkürler!
Federico Ponzi
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.