Dosya içeriğini küçük harfe dönüştürün


85

Ben tempbazı küçük harfle ve büyük harf içeriği ile dosya.

Giriş

Dosyamın içeriği temp:

hi
Jigar
GANDHI
jiga

Yukarıdan aşağıya çevirmek istiyorum .

komuta

Aşağıdaki komutu denedim:

sed -e "s/[A-Z]/[a-z]/g" temp

ancak yanlış çıktı çıktı.

Çıktı

Bunu şöyle istiyorum:

hi
jigar
gandhi
jiga

Argümanın yerine geçen kısımda ne olması gerekiyor sed?


Yanıtlar:


122

Girişiniz yalnızca ASCII karakterleri içeriyorsa, şunu kullanabilirsiniz tr:

tr A-Z a-z < input 

veya (IMO'yu hatırlamak ve yazmak daha az kolaydır; ancak GNU dahil bazı uygulamalarda trhala tek baytlık karakterlerle, bu nedenle UTF-8 yerellerinde hala ASCII harfleriyle sınırlıdır) , ancak ASCII latin harfleriyle sınırlı değildir :

tr '[:upper:]' '[:lower:]' < input

kullanmak zorundaysanız sed:

sed 's/.*/\L&/g' < input

(burada GNU uygulamasını varsayarsak).

POSIX ile sed, tüm çevirileri belirtmeniz gerekir ve ardından hangi harfleri dönüştürmek istediğinizi seçebilirsiniz:

sed 'y/AǼBCΓDEFGH.../aǽbcγdefgh.../' < input

İle awk:

awk '{print tolower($0)}' < input

3
Lütfen bunun \Lbir GNU uzantısı olduğunu unutmayın .
Anthon

\Lşimdiye kadar benim için iyi çalışıyor. GNU eklentisini
JigarGandhi

2
@JigarGandhi. sedbir Unix komutudur. Farklı sistemler, farklı davranış ve işlevselliğe sahip farklı değişkenlere sahiptir. Neyse ki, bugünlerde, en uygun olanı vardır, böylece herkes için ortak olan minimum özellikler setine güvenebilirsiniz. \Laralarında değil ve GNU tarafından tanıtıldı sed(aynı ex/ standart ile aynı operatöre uyuyor vi) ve genellikle diğer uygulamalarda mevcut değildir.
Stéphane Chazelas,

9
trGNU gibi bazı uygulamaların trçok baytlı yerel ayarlarda düzgün çalışmadığını unutmayın (çoğu bugünlerde, echo STÉPHANE | tr '[:upper:]' '[:lower:]'örneğin deneyin ). GNU sistemlerinde, sedvaryantı veya awk'yi tercih edebilirsiniz tolower().
Stéphane Chazelas

5
Hafif düzeltme: sed 's/.*/\L&/g' < input. \1Eşleştirilen alt dizeye yapılan referans, altında parantez olan alt dizeyi belirtmediğiniz sürece çalışmaz. Ancak, &tüm maçı göstermek için kullanmak biraz daha temiz , gösterildiği gibi
Edward Brown

30

Vim kullanarak, süper basit:

$ vim filename
gg0guGZZ

Dosyayı açar, ggilk satıra 0, ilk sütuna gider . İle guG, tüm karakterlerin büyük / küçük harflerini dosyanın altına indirir. ZZkaydeder ve çıkar.

Ona attığın her şeyi idare etmeli; sayıları yok sayar, ASCII olmayanları ele alır.

Bunun tersini yapmak istiyorsanız, küçük harfli harfleri büyük harfe çevirin, ua U: gg0gUGZZile değiştirin .


14
Lol "süper basit"
blambert

Açıkçası bu birçok dosya için iyi ölçeklendirilemez
Corey Goldberg

Şimdiye kadar en sevdiğim cevabı !!!!
Mona Jalal

1
@CoreyGoldberg vim file1 file2 fileetcgibi ve sonra bir şey :bufdo gg0guG:w<CR>olur muhtemelen dosyaların herhangi bir sayı için çalışıyorum. Yine de test etmedim!
TankorSmash

Hala çok sayıda dosyaya ölçeklenemeyen @TankorSmash
Corey Goldberg

17

Bunun ddiçin kendim seviyorum .

<<\IN LC_ALL=C 2<>/dev/null \
dd conv=lcase
hi
Jigar 
GANDHI
jiga
IN

... alır ...

hi
jigar
ghandi
jiga

LC_ALL=CGirişteki herhangi multibytes korumaktır - herhangi baytlı başkentleri dönüştürülemez olsa. Aynısı (GNU) için de geçerlidir tr- her iki uygulama da C olmayan herhangi bir yerel ayarda girdi yönetimine yatkındır. iconvkapsamlı bir çözüm için ikisiyle de birleştirilebilir.

2>/dev/nullYönlendirme atar dd'ın varsayılan durum raporu - ve onun stderr. Bu olmadan, ddkaç bayt işlendi ve diğerleri gibi baskı bilgileri ile yukarıdaki gibi bir işin tamamlanmasını izlerdi


Bu çözüm, trbüyük dosyaları kullanırken olduğundan çok daha hızlıdır , teşekkürler!
WhiteWinterWolf

13

Perl 5'i de kullanabilirsiniz:

perl -pe '$_=lc' temp

Seçenek -p, perl'e, belirtilen ifadeyi her girdi satırı için bir kez çalıştırmasını, sonucu basmasını, yani son değerini yazmasını söyler $_. -eprogramın, betiği içeren bir dosyanın aksine, bir sonraki argüman olacağını belirtir. lcküçük harfe dönüştürür. Bir tartışma olmadan, devam edecek $_. Ve $_=yine kaydeder, böylece yazdırılır.

Bunun bir varyasyonu olabilir

perl -ne 'print lc' temp

Kullanılması -ngibidir -pdışında $_sonunda basılmış almazsınız. Bu değişkene kaydetmek yerine, açık bir print deyimi ekliyorum.

Perl'in sed'in aksine bir avantajı, herhangi bir GNU eklentisine ihtiyacınız olmamasıdır. GNU dışı ortamlarla uyumlu olması gereken, ancak zaten Perl'e bağımlılığı olan projeler var. Bununla karşılaştırıldığında tr, Perl'in lcyerel olarak daha bilinçli hale getirilmesi daha kolay olabilir. Detaylar için perllocaleman sayfasına bakınız.


9

Eşleşen deseni yakalamanız ve ardından değiştiriciyle değiştiriciyi kullanmanız gerekir:

sed 's/\([A-Z]\)/\L\1/g' temp

\(...\)Kapsayan eşleşti metin, birinci yakalama gider "yakalar" \1, yanında \2iç içe yakalar durumunda parantez açarak için numaralandırma göredir, vb.

\LYakalanan desen küçük harfe dönüştürür de var \Ubüyük harf için.


3
bunu yapmanıza gerek yok - bütün kalıp daima yakalanır&
mikeserv

Doğru, ama sonra yakalama maçlarını açıklama fırsatını
kaçırırdım

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.