sed one-liner per convertire tutte le maiuscole in minuscole?


131

Ho un file di testo in cui alcune parole sono stampate in TUTTO MAIUSCOLO. Voglio essere in grado di convertire tutto in minuscolo in file di testo, usando sed. Ciò significa che la prima frase dovrebbe quindi leggere: "Ho un file di testo in cui alcune parole sono stampate in maiuscolo".


6
sei a conoscenza del trcomando? A volte è più adatto di sed.
Bryan Oakley,

@Bryan Oakley non lo ero finora. Grazie per segnalarlo. Ma come lo uso per fare quello che stavo chiedendo?
magnetar,

guarda nel link fornito nella risposta di Raghuram.
Bryan Oakley,

1
se devi usare sed, cat <input> | sed 'y / ABCDEFÑØÅÆŒ / abcdefñøåæœ /' <- Devi specificare tutti i caratteri, maiuscoli e minuscoli. So che è complicato scrivere tutti quei personaggi, ma funzionerà anche con tutti quei caratteri SPECIAL internazionali. :)
Arno Teigseth,

Risposte:


248

Con 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

Funziona con GNU sed(BSD sednon supporta \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
Ho dovuto scegliere la mia risposta perché non sono un fan delle risposte che consistono solo in collegamenti.
magnetar,

6
OSX non supporta neanche le estensioni GNU :(
ekkis

2
sed -e 's/.*/\L&/' input.txt > output.txtanche per GNU sed funziona bene
Asfand Qazi,

1
@ekkis OSX sta usando BSD (come detto, BSD sed non lo supporta). Prova a leggere la prima riga di man sedper sapere quale versione stai utilizzando.
Ryder,

Per qualche ragione quando uso il tuo modello maiuscolo, aggiunge un Udavanti a ogni riga
Xtremefaith

51

Se si dispone di estensioni GNU, è possibile utilizzare \ L (corrispondenza inferiore intera o fino a quando \ L [inferiore] o \ E [fine - disattiva casing disattivato), in questo modo:

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

Nota: "&" indica il modello di corrispondenza completo.

Come nota a margine, le estensioni GNU includono \ U (in alto), \ u (carattere successivo più alto della partita), \ l (carattere successivo più basso della partita). Ad esempio, se si desidera camelcase una frase:

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

Nota: dato che si presume che abbiamo estensioni GNU, possiamo anche usare l'opzione dash-r (espressioni regolari estese), che consente \ w (carattere parola) e ti allevia di dover sfuggire alla parentesi di cattura e una o più quantificatore (+). (A parte: \W [non-word], \s [whitespace], \S [non-whitespace]sono supportati con il precipitare-r, ma \d [digit]e \D [non-digit]non sono.)


1
Consiglio molto utile. Ho scoperto che le parentesi tonde non sono necessarie nell'esempio del caso del cammello. Anche 's / \ w + / \ u & / g' funziona.
PJ_Finnegan,

1
sed -ri 's/MATCH_WHATEVER/\L&/i' input-file.ext- l'uso del /imodificatore rende il match insensibile alle maiuscole e quindi è facoltativo. Lo -iswitch dice a sed di modificare il file sul posto. Non è necessario reindirizzare l'output su un altro file se non è necessario.
Jim,

1
Ne avevo davvero bisogno \E [end - toggle casing off]. Grazie !
Mehdi Yedes,

37

Puoi anche farlo molto facilmente con awk, se sei disposto a prendere in considerazione uno strumento diverso:

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

1
La sua migliore risposta, perché lavora con il cirillico. tr: - non ha funzionato con esso.
Amaroc,

2
Fai attenzione ai personaggi con accenti. tolowernon sarà in grado di gestire Àad esempio
Sam Houston,

Puoi rinominare un mucchio di file con quel comando: ls | awk '{print "mv " $0 " " tolower($0)}' | sh
Neekobus

15

Ecco molte soluzioni:

Per ingrandire con perl, tr, sed e 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)}'

Minuscolo con perl, tr, sed e 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)}'

Bash complicato in minuscolo:

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

Bash complicato in maiuscolo:

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

Semplice da bash a minuscolo:

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

Semplice da maiuscolo a maiuscolo:

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

Nota che $ {v,} e $ {v ^} cambiano solo la prima lettera.

Dovresti usarlo in questo modo:

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

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

Produzione:

ciao mi chiamo sujit

5

Mi piacciono alcune delle risposte qui, ma c'è un comando sed che dovrebbe fare il trucco su qualsiasi piattaforma:

sed 'y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/'

Ad ogni modo, è facile da capire. E conoscere il comando y può tornare utile a volte.


2
Questo non funziona con caratteri internazionali arbitrari ma funziona con caratteri ASCII in OS / X
emrys57

Certamente ha fatto il lavoro per me. Devo ammettere che è stata la prima volta che ho usato il comando y. Grazie!
mons

4

Se si utilizza posix sed

Selezione per ogni caso per un pattern (convertendo il pattern cercato con questo sed che utilizzare il pattern convertito nel comando desiderato usando regex:

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}"

converti in minuscolo

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"

lo stesso per le maiuscole sostituisce la lettera inferiore tra // con l'equivalente superiore nella sed

Divertiti


(Ho scoperto che questo ha funzionato meglio su MacOS) - Bello, amico mio - ma un piccolo topolino - hai il caso Jj al contrario. Dovrebbe essere 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 / [AA] / y / g; s / [zZ] / z / g "
Neil McGill

Non sono sicuro del motivo per cui devi fare qualcosa di così laborioso. Suppongo che Mac OS non abbia estensioni GNU, ma se non hai intenzione di usare sed, invece di sostituzione ('s') potresti usare la traslitterazione ('y') in questo modo: sed 'y / ABCDEFGHIJKLMNOPQRSTUVWXYZ / abcdefghijklmnopqrstuvwxyz / '
Luv2code

l'obiettivo era quello di selezionare qualsiasi modello di testo che assomiglia a una maiuscola / minuscola da un sed non GNU senza cambiare il contenuto della fonte di dati ( y//cambiare il contenuto della fonte o perdere la ricerca del modello.
NeronLeVelu

3

breve, dolce e non hai nemmeno bisogno di reindirizzamento :-)

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

Ah, beh, ho provato a usarlo con uno sguardo dietro e in qualche modo ha sostituito la maggior parte delle lettere nei miei file con altre lettere maiuscole casuali. Mi ha fatto comunque una bella risata. Sono stato in grado di ricavare ciò che volevo anche da questa risposta su perl: askubuntu.com/a/527073/250556
ThorSummoner
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.