2008-09-18 27 views

cevap

41

dj_segfault'un işaret ettiği gibi, kabuk sizin için en iyisini yapabilir. Yine de, dize, daha düşük kasa için harici bir yere geri dönmek zorunda kalacak gibi görünüyor. Bunun için, yukarıdaki perl one-liners gibi pek çok seçeneğiniz var, ama bence muhtemelen en basit olanı.

# first, strip underscores 
CLEAN=${STRING//_/} 
# next, replace spaces with underscores 
CLEAN=${CLEAN// /_} 
# now, clean out anything that's not alphanumeric or an underscore 
CLEAN=${CLEAN//[^a-zA-Z0-9_]/} 
# finally, lowercase with TR 
CLEAN=`echo -n $CLEAN | tr A-Z a-z` 

burada sipariş

biraz önemlidir. Alt çizgilerden kurtulmak ve boşlukları altçizgilerle değiştirmek istiyoruz, bu yüzden önce alt çizgiler çizdiğimizden emin olmalıyız. Sonuna kadar olan şeyleri geçmek için beklemekle, sadece alfanümerik ve altçizgi olduğumuzu biliyoruz ve uzayımız olmadığından emin olabiliriz, bu yüzden kabuk tarafından yorumlanan özel karakterler hakkında endişelenmemize gerek yok.

+1

Okuyucu için not: Bu işi yapmakta zorluk çekiyorsanız, bash veya sh'ı çağırıp aramadığınızı ve sisteminizin 'sh' şeklini nasıl yorumladığını görmek için shebang'ınızı kontrol edin. –

+2

Bash 4'ten itibaren, aynı zamanda durum değişikliği de yapabilir. 'smallcase = $ {CLEAN ,,}' [Bash Hackers Wiki] (http: //wiki.bash-hackers.org/syntax/pe) parametre genişletmelerini, man sayfalarından daha fazla insan tarafından okunabilir bir şekilde açıklar. – toxalot

+0

Güzel iş. Daha önce bu kabuk özelliklerinden haberdar değildim. Teşekkürler! Sadece zsh * bunların tümünü * yuvalayabileceğinizi keşfettim, bu yüzden hepsini bir satırda yapabilirsiniz: 'echo -n $ {$ {$ {str // _ /} ///_} // [^ a-zA-Z0-9 _] /} | tr A-Z a-z' .. bir betikte anlaşılmaz bir şey koymanızı öneriyorum. :) (düzenleme: biçimlendirme) –

0

:

export CLEANSTRING="`echo -n "${STRING}" | tr -cd '[:alnum:] [:space:]' | tr '[:space:]' '-' | tr '[:upper:]' '[:lower:]'`" 

Occam's razor, herhalde. Hızlı ve kirli

+0

Eğer "STRING = $ (rm/tmp/*)" değerini ayarlarsanız, temizlemeden önce $ STRING değerini eklerseniz, alt kabuğu yürütür ve/tmp/content'inizi kaldırır. herhangi bir eko yapılmadan ÖNCE sanitize edin – higuita

1

:

STRING=`echo 'dit /ZOU/ een test123' | perl -pe's/ //g;tr/[A-Z]/[a-z]/;s/[^a-zA-Z0-9]//g'`

+0

Benim çalışmama başladığımda çözümünüzü görmemiştim. – Axeman

1

Bunu perl aracılığıyla çalıştırabilir. Burada Ksh tarzı altkabuk kullanıyorum

export CLEANSTRING=$(perl -e 'print join(q//, map { s/\\s+/_/g; lc } split /[^\\s\\w]+/, \$ENV{STRING})') 

, ben bash çalıştığını tamamen emin değilim. kabuğu hakkında güzel bir şey var

, sen, awk, sed, grep ....

29

Bash tüm başlıbaşına yapabilirsiniz perl kullanırsanız çok teşekkür ederim olabilir. Eğer Parametre Genişleme adam sayfasının bölümüne bakacak olursak, bu bash yerleşik olduğu değiştirmelerin göreceksiniz, alt dize, do,

tüm alfanümerik olmayan karakterler ortadan kaldırmak için, vb rtrim, Döşeme

CLEANSTRING=${STRING//[^a-zA-Z0-9]/} 

Occam'ın jilet var bu. Başka bir işlem başlatmaya gerek yok.

+0

Peki koy, harika cevap. Bunu gerçekleştirmeden parametre genişletme kullanıyordum. –

+2

Teknik özelliklerin bir alt kümesi için iyi bir yanıttır, ancak boşlukları alt çizgilere dönüştürmez. – Axeman

İlgili konular