Tüm büyük harfleri küçük harfe dönüştürmek için tek satırlık


131

Bazı kelimelerin TÜM BÜYÜK HARFLERLE yazdırıldığı bir metin dosyam var. Kullanarak metin dosyasındaki her şeyi küçük harfe dönüştürebilmek istiyorum sed. Bu, ilk cümlenin daha sonra 'bazı kelimelerin tümü büyük harflerle basıldığı bir metin dosyam var' şeklinde olacağı anlamına gelir.


6
trkomutun farkında mısın? Bazen daha uygundur sed.
Bryan Oakley

@Bryan Oakley Şimdiye kadar değildim. Gösterdiğiniz için teşekkürler. Ama istediğimi yapmak için onu nasıl kullanırım?
magnetar

Raghuram'ın cevabında verilen bağlantıya bakın.
Bryan Oakley

1
sed kullanmanız gerekiyorsa, cat <input> | sed 'y / ABCDEFÑØÅÆŒ / abcdefñøåæœ /' <- Büyük harften küçük harfe tüm karakterleri detaylandırmalısınız. Tüm bu karakterleri yazmanın külfetli olduğunu biliyorum ama aynı zamanda tüm uluslararası ÖZEL karakterlerle de işe yarayacak. :)
Arno Teigseth

Yanıtlar:


248

İle tr:

# Converts upper to lower case 
$ tr '[:upper:]' '[:lower:]' < input.txt > output.txt

# Converts lower to upper case
$ tr '[:lower:]' '[:upper:]' < input.txt > output.txt

GNU kullanarak çalışır sed(BSD seddesteklemez \L \U):

# Converts upper to lower case
$ sed -e 's/\(.*\)/\L\1/' input.txt > output.txt

# Converts lower to upper case
$ sed -e 's/\(.*\)/\U\1/' input.txt > output.txt

6
Kendi cevabımı seçmek zorunda kaldım çünkü sadece bağlantılardan oluşan cevapların hayranı değilim.
magnetar

6
OSX de GNU uzantılarını desteklemiyor :(
ekkis

2
sed -e 's/.*/\L&/' input.txt > output.txtGNU sed için de iyi çalışıyor
Asfand Qazi

1
@ekkis OSX, BSD kullanıyor (belirtildiği gibi, BSD sed bunu desteklemiyor). man sedHangi sürümü kullandığınızı öğrenmek için en üst satırını okumayı deneyin .
Ryder

Bazı nedenlerden dolayı, büyük harf kalıbınızı kullandığımda, Uher satırın önüne bir ekliyor
Xtremefaith

51

GNU uzantılarınız varsa, sed'in \ L'yi (daha düşük tüm eşleşme veya \ L [daha düşük] veya \ E [son - büyük / küçük harf kapalı] 'ya ulaşılana kadar kullanabilirsiniz:

sed 's/.*/\L&/' <input >output

Not: '&', tam eşleşme modeli anlamına gelir.

Bir yan not olarak, GNU uzantıları arasında \ U (üst), \ u (eşleşmenin sonraki üst karakteri), \ l (eşleşmenin sonraki karakteri) bulunur. Örneğin, bir cümle üzerine yazmak istiyorsanız:

$ sed -r 's/\w+/\u&/g' <<< "Now is the time for all good men..." # Camel Case
Now Is The Time For All Good Men...

Not: Varsayım, GNU uzantılarımız olduğu olduğu için, \ w (kelime karakterine) izin veren ve sizi yakalama parantezinden ve bir veya daha fazlasından kaçmak zorunda bırakan tire-r (genişletilmiş düzenli ifadeler) seçeneğini de kullanabiliriz. nicelik belirteci (+). (Bir yana: \W [non-word], \s [whitespace], \S [non-whitespace]aynı zamanda tire-r ile desteklenen, ancak \d [digit]ve \D [non-digit]değildir.)


1
Çok faydalı bir ipucu. Deve durumu örneğinde yuvarlak parantezlere gerek olmadığını buldum. 's / \ w + / \ u & / g' da çalışır.
PJ_Finnegan

1
sed -ri 's/MATCH_WHATEVER/\L&/i' input-file.ext- /ideğiştiriciyi kullanmak, eşleşmeyi büyük / küçük harf duyarlı hale getirir ve bu nedenle isteğe bağlıdır. -iAnahtar yerinde dosyasını değiştirmek için sed söyler. Gerekmiyorsa, çıktıyı başka bir dosyaya yönlendirmenize gerek yok.
Jim

1
Buna gerçekten ihtiyacım vardı \E [end - toggle casing off]. Teşekkür ederim !
Mehdi Yedes

37

awkFarklı bir araç kullanmayı düşünürseniz, bunu çok kolay bir şekilde yapabilirsiniz :

echo "UPPER" | awk '{print tolower($0)}'

1
En iyi yanıtı, çünkü Kiril ile çalışmak. tr: - onunla çalışmadı.
Amaroc

2
Aksanlı karakterlere dikkat edin. örneğin toloweridare edemeyecekÀ
Sam Houston

Bu komutla bir grup dosyayı yeniden adlandırabilirsiniz: ls | awk '{print "mv " $0 " " tolower($0)}' | sh
Neekobus

15

İşte birçok çözüm:

Perl, tr, sed ve awk ile upercaser'a

perl -ne 'print uc'
perl -npe '$_=uc'
perl -npe 'tr/[a-z]/[A-Z]/'
perl -npe 'tr/a-z/A-Z/'
tr '[a-z]' '[A-Z]'
sed y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/
sed 's/\([a-z]\)/\U\1/g'
sed 's/.*/\U&/'
awk '{print toupper($0)}'

Perl, tr, sed ve awk ile küçük harfe çevirmek

perl -ne 'print lc'
perl -npe '$_=lc'
perl -npe 'tr/[A-Z]/[a-z]/'
perl -npe 'tr/A-Z/a-z/'
tr '[A-Z]' '[a-z]'
sed y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/
sed 's/\([A-Z]\)/\L\1/g'
sed 's/.*/\L&/'
awk '{print tolower($0)}'

Küçük harfe karmaşık bash:

while read v;do v=${v//A/a};v=${v//B/b};v=${v//C/c};v=${v//D/d};v=${v//E/e};v=${v//F/f};v=${v//G/g};v=${v//H/h};v=${v//I/i};v=${v//J/j};v=${v//K/k};v=${v//L/l};v=${v//M/m};v=${v//N/n};v=${v//O/o};v=${v//P/p};v=${v//Q/q};v=${v//R/r};v=${v//S/s};v=${v//T/t};v=${v//U/u};v=${v//V/v};v=${v//W/w};v=${v//X/x};v=${v//Y/y};v=${v//Z/z};echo "$v";done

Büyük harfe karmaşık bash:

while read v;do v=${v//a/A};v=${v//b/B};v=${v//c/C};v=${v//d/D};v=${v//e/E};v=${v//f/F};v=${v//g/G};v=${v//h/H};v=${v//i/I};v=${v//j/J};v=${v//k/K};v=${v//l/L};v=${v//m/M};v=${v//n/N};v=${v//o/O};v=${v//p/P};v=${v//q/Q};v=${v//r/R};v=${v//s/S};v=${v//t/T};v=${v//u/U};v=${v//v/V};v=${v//w/W};v=${v//x/X};v=${v//y/Y};v=${v//z/Z};echo "$v";done

Küçük harfe basit bash:

while read v;do echo "${v,,}"; done

Büyük harfe basit bash:

while read v;do echo "${v^^}"; done

$ {V,} ve $ {v ^} sadece ilk harfi değiştirdiğine dikkat edin.

Bunu şu şekilde kullanmalısın:

(while read v;do echo "${v,,}"; done) < input_file.txt > output_file.txt

7
echo  "Hello  MY name is SUJIT "  | sed 's/./\L&/g'

Çıktı:

merhaba benim adım sujit

5

Buradaki bazı cevapları seviyorum, ancak hile herhangi bir platformda yapması gereken bir sed komutu var:

sed 'y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/'

Her neyse, anlaşılması kolay. Ve y komutunu bilmek bazen kullanışlı olabilir.


2
Bu, rasgele uluslararası karakterler için çalışmaz, ancak OS / X'teki ASCII karakterleri için çalışır
emrys57

Kesinlikle benim için işi yaptı. Y komutunu ilk kez kullandığım zaman kabul etmeliyim. Teşekkürler!
monsune

4

Posix sed kullanıyorsanız

Bir kalıp için herhangi bir durum için seçim (aranan kalıbı bu sed ile dönüştürmek, istediğiniz komutta normal ifadeyi kullanarak dönüştürülmüş kalıbı kullanmak yerine:

echo "${MyOrgPattern} | sed "s/[aA]/[aA]/g;s/[bB]/[bB]/g;s/[cC]/[cC]/g;s/[dD]/[dD]/g;s/[eE]/[eE]/g;s/[fF]/[fF]/g;s/[gG]/[gG]/g;s/[hH]/[hH]/g;s/[iI]/[iI]/g;s/[jJ]/[jJ]/g;s/[kK]/[kK]/g;s/[lL]/[lL]/g;s/[mM]/[mM]/g;s/[nN]/[nN]/g;s/[oO]/[oO]/g;s/[pP]/[pP]/g;s/[qQ]/[qQ]/g;s/[rR]/[rR]/g;s/[sS]/[sS]/g;s/[tT]/[tT]/g;s/[uU]/[uU]/g;s/[vV]/[vV]/g;s/[wW]/[wW]/g;s/[xX]/[xX]/g;s/[yY]/[yY]/g;s/[zZ]/[zZ]/g" | read -c MyNewPattern
 YourInputStreamCommand | egrep "${MyNewPattern}"

küçük harfle dönüştür

sed "s/[aA]/a/g;s/[bB]/b/g;s/[cC]/c/g;s/[dD]/d/g;s/[eE]/e/g;s/[fF]/f/g;s/[gG]/g/g;s/[hH]/h/g;s/[iI]/i/g;s/j/[jJ]/g;s/[kK]/k/g;s/[lL]/l/g;s/[mM]/m/g;s/[nN]/n/g;s/[oO]/o/g;s/[pP]/p/g;s/[qQ]/q/g;s/[rR]/r/g;s/[sS]/s/g;s/[tT]/t/g;s/[uU]/u/g;s/[vV]/v/g;s/[wW]/w/g;s/[xX]/x/g;s/[yY]/y/g;s/[zZ]/z/g"

büyük harf için aynı: küçük harf yerine sed içinde // büyük eşdeğerini koyun

İyi eğlenceler


(Bunun en iyi MacOS'ta çalıştığını buldum) - Güzel, dostum - ama küçük bir topo - Jj davası geriye dönük. "S / [aA] / a / g; s / [bB] / b / g; s / [cC] / c / g; s / [dD] / d / g; s / [eE] / olarak ayarlanmalıdır e / g s / [fF] / f / g s / [gG] / g / g s / [SS] / sa / g s / [iI] / i / g s / [JJ] / j / g s / [kK] / k / g s / [lL] / l / g s / [mM] / m / g s / [nN] / n / g s / [oO] / o / g s / [pp] / p / g s / [qo] / q / g s / [rR] / r / g s / [sS] / sn / g s / [tT] / t / g s / [uU] / u / g s / [vV] / h / g s / [wW] / g / a; s / [xX] / x / g s / [YY] / y / g; s / [zZ] / z / g "
Neil McGill

Neden bu kadar yoğun emek gerektiren bir şey yapmanız gerektiğinden emin değilim. Mac OS'nin GNU uzantılarına sahip olmadığını varsayıyorum, ancak sed kullanmaya tamamen hazırsanız, ikame ('s') yerine harf çevirisini ('y') şu şekilde kullanabilirsiniz: sed 'y / ABCDEFGHIJKLMNOPQRSTUVWXYZ / abcdefghijklmnopqrstuvwxyz / '
Luv2code

amaç, veri kaynağının içeriğini değiştirmeden GNU olmayan bir y//
sed'den

3

kısa, tatlı ve yeniden yönlendirmeye bile ihtiyacın yok :-)

perl -p -i -e 'tr/A-Z/a-z/' file

Hah, bunu arkamdan bir bakışla kullanmayı denedim ve bir şekilde dosyalarımdaki tüm harflerin çoğunu diğer rastgele büyük harflerle değiştirdim. Yine de beni güzelce güldürdü. Bu yanıttan istediğimi perl hakkında da çıkarabildim
ThorSummoner
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.