Mam plik tekstowy, w którym niektóre słowa są wydrukowane WIELKIMI LITERAMI. Chcę móc po prostu przekonwertować wszystko w pliku tekstowym na małe litery, używając sed
. Oznacza to, że pierwsze zdanie brzmiałoby wtedy: „Mam plik tekstowy, w którym niektóre słowa są drukowane wielkimi literami”.
136
tr
polecenie? Czasami jest to bardziej odpowiednie niżsed
.Odpowiedzi:
Z
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
Lub
sed
na GNU (ale nie BSD lub Mac, ponieważ nie obsługują\L
lub\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
źródło
sed -e 's/.*/\L&/' input.txt > output.txt
dla GNU sed też działa dobrzeman sed
aby dowiedzieć się, której wersji używasz.U
przed każdą liniąJeśli masz rozszerzenia GNU, możesz użyć \ L seda (całe dopasowanie do najniższego poziomu lub do momentu osiągnięcia \ L [niższy] lub \ E [koniec - wyłącz wielkość liter]), na przykład:
sed 's/.*/\L&/' <input >output
Uwaga: „&” oznacza pełny wzorzec dopasowania.
Na marginesie, rozszerzenia GNU obejmują \ U (górny), \ u (górny następny znak dopasowania), \ l (dolny następny znak dopasowania). Na przykład, jeśli chcesz nadać zdanie na wielbłądzie:
$ sed -r 's/\w+/\u&/g' <<< "Now is the time for all good men..." # Camel Case Now Is The Time For All Good Men...
Uwaga: Ponieważ założenie jest takie, że mamy rozszerzenia GNU, możemy również użyć opcji myślnik-r (rozszerzone wyrażenia regularne), która pozwala na \ w (znak słowa) i zwalnia cię z konieczności ucieczki przed nawiasem przechwytującym i jednym lub więcej kwantyfikator (+). (Poza tym:
\W [non-word], \s [whitespace], \S [non-whitespace]
są również obsługiwane przez dash-r, ale\d [digit]
i\D [non-digit]
nie są).źródło
sed -ri 's/MATCH_WHATEVER/\L&/i' input-file.ext
- użycie/i
modyfikatora sprawia, że dopasowanie nie uwzględnia wielkości liter i dlatego jest opcjonalne.-i
Przełącznik nakazuje sed zmienić plik w miejscu. Nie ma potrzeby przekierowywania wyjścia do innego pliku, jeśli nie jest to konieczne.\E [end - toggle casing off]
. Dziękuję Ci !\L\1
taką, więc\L&
jest to wyjątek z brakującym ukośnikiem odwrotnym. Przetestowałem to i jeśli dodasz odwrotny ukośnik przed&
, po prostu otrzymasz dosłowny&
.Możesz to również zrobić bardzo łatwo
awk
, jeśli chcesz rozważyć inne narzędzie:echo "UPPER" | awk '{print tolower($0)}'
źródło
tolower
nie poradzi sobieÀ
na przykładls | awk '{print "mv " $0 " " tolower($0)}' | sh
Oto wiele rozwiązań:
Do upercasera z perl, tr, sed i awk
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)}'
Małe litery z perl, tr, sed i awk
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)}'
Skomplikowany bash na małe litery:
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
Skomplikowany bash na wielkie litery:
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
Proste bash na małe litery:
while read v;do echo "${v,,}"; done
Proste bash na wielkie litery:
while read v;do echo "${v^^}"; done
Zauważ, że $ {v,} i $ {v ^} zmieniają tylko pierwszą literę.
Powinieneś go używać w ten sposób:
(while read v;do echo "${v,,}"; done) < input_file.txt > output_file.txt
źródło
echo "Hello MY name is SUJIT " | sed 's/./\L&/g'
Wynik:
źródło
Podobają mi się niektóre odpowiedzi tutaj, ale istnieje polecenie sed, które powinno załatwić sprawę na każdej platformie:
sed 'y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/'
Zresztą łatwo to zrozumieć. Znajomość polecenia y może się czasem przydać.
źródło
Jeśli używasz posix sed
Wybór dowolnego przypadku dla wzorca (konwertowanie szukanego wzorca za pomocą tego seda niż użycie przekonwertowanego wzorca w żądanym poleceniu za pomocą wyrażenia regularnego:
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}"
konwertować małymi literami
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"
to samo dla wielkich liter zamień małą literę między // na górny odpowiednik w sed
baw się dobrze
źródło
y//
zmiany zawartości źródła lub mogło zabraknąć szukanie wzorca.krótkie, słodkie i nie potrzebujesz nawet przekierowania :-)
perl -p -i -e 'tr/A-Z/a-z/' file
źródło