sed jednowierszowy, aby przekonwertować wszystkie wielkie litery na małe?

136

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”.

magnetar
źródło
6
czy znasz trpolecenie? Czasami jest to bardziej odpowiednie niż sed.
Bryan Oakley
@Bryan Oakley Nie byłem aż do teraz. Dzięki za wskazanie tego. Ale jak mam go użyć, aby zrobić to, o co prosiłem?
magnetar
spójrz na link podany w odpowiedzi Raghurama.
Bryan Oakley,
1
jeśli musisz użyć seda, cat <input> | sed 'y / ABCDEFÑØÅÆŒ / abcdefñøåæœ /' <- Musisz wyszczególnić wszystkie znaki, od wielkich do małych. Wiem, że pisanie tych wszystkich znaków jest niewygodne, ale będzie też działać z tymi wszystkimi międzynarodowymi znakami SPECIAL. :)
Arno Teigseth

Odpowiedzi:

258

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 sedna GNU (ale nie BSD lub Mac, ponieważ nie obsługują \Llub \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
 
magnetar
źródło
7
Musiałem wybrać własną odpowiedź, ponieważ nie jestem fanem odpowiedzi, które składają się tylko z linków.
magnetar
7
OSX również nie obsługuje rozszerzeń GNU :(
ekkis
2
sed -e 's/.*/\L&/' input.txt > output.txtdla GNU sed też działa dobrze
Asfand Qazi
1
@ekkis OSX używa BSD (jak wspomniano, sed BSD go nie obsługuje). Spróbuj przeczytać górną linię, man sedaby dowiedzieć się, której wersji używasz.
Ryder,
Z jakiegoś powodu, kiedy używam twojego wzorca wielkich liter, dodaje Uprzed każdą linią
Xtremefaith
52

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ą).

Luv2code
źródło
1
Bardzo przydatna wskazówka. Odkryłem, że okrągłe nawiasy nie są potrzebne w przykładzie wielbłąda. „s / \ w + / \ u & / g” też działa.
PJ_Finnegan
1
sed -ri 's/MATCH_WHATEVER/\L&/i' input-file.ext- użycie /imodyfikatora sprawia, że ​​dopasowanie nie uwzględnia wielkości liter i dlatego jest opcjonalne. -iPrzełącznik nakazuje sed zmienić plik w miejscu. Nie ma potrzeby przekierowywania wyjścia do innego pliku, jeśli nie jest to konieczne.
Jim
1
Naprawdę tego potrzebowałem \E [end - toggle casing off]. Dziękuję Ci !
Mehdi Yedes
Zauważ, że składnia generalnie wygląda na \L\1taką, 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 &.
Roel Van de Paar
37

Możesz to również zrobić bardzo łatwo awk, jeśli chcesz rozważyć inne narzędzie:

echo "UPPER" | awk '{print tolower($0)}'
whitehat237
źródło
1
Najlepsza odpowiedź, bo pracuj z cyrylicą. tr: - nie działało z tym.
Amaroc
2
Uważaj na postacie z akcentami. tolowernie poradzi sobie Àna przykład
Sam Houston
Możesz zmienić nazwę wielu plików za pomocą tego polecenia: ls | awk '{print "mv " $0 " " tolower($0)}' | sh
Neekobus
15

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
Vouze
źródło
8
echo  "Hello  MY name is SUJIT "  | sed 's/./\L&/g'

Wynik:

cześć mam na imię sujit
Sujit Dhamale
źródło
6

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ć.

Dennis
źródło
2
To nie działa dla dowolnych znaków międzynarodowych, ale działa dla znaków ASCII w OS / X
emrys57
Z pewnością wykonał pracę za mnie. Muszę przyznać, że pierwszy raz użyłem polecenia y. Dzięki!
poniedziałek
4

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

NeronLeVelu
źródło
(Odkryłem, że ten działał najlepiej na MacOS) - Miło, przyjacielu - ale malutki topo - masz obudowę Jj do tyłu. Powinien być 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 / [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 / [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] / r / g; s / [zZ] / z / g "
Neil McGill,
Nie jestem pewien, dlaczego musisz zrobić coś tak pracochłonnego. Zakładam, że Mac OS nie ma rozszerzeń GNU, ale jeśli nie masz ochoty na używanie seda, zamiast podstawiania ('s') możesz użyć transliteracji ('y') w ten sposób: sed 'y / ABCDEFGHIJKLMNOPQRSTUVWXYZ / abcdefghijklmnopqrstuvwxyz / '
Luv2code
celem było wybrać dowolny wzór tekstowy, który wygląda jak górny / dolny przypadku z nie GNU sed bez zmiany zawartości źródła danych (do y//zmiany zawartości źródła lub mogło zabraknąć szukanie wzorca.
NeronLeVelu
3

krótkie, słodkie i nie potrzebujesz nawet przekierowania :-)

perl -p -i -e 'tr/A-Z/a-z/' file
pedrito
źródło
Hah, cóż, próbowałem tego użyć, patrząc za siebie i w jakiś sposób zastąpiło to większość wszystkich liter w moich plikach innymi przypadkowymi dużymi literami. I tak mnie roześmiałeś. Udało mi się również wyprowadzić to, czego chciałem, z tej odpowiedzi na temat perla: askubuntu.com/a/527073/250556
ThorSummoner