sed one-liner para converter todas as maiúsculas em minúsculas?

131

Eu tenho um arquivo de texto no qual algumas palavras são impressas em TODAS AS CAPS. Eu quero poder converter tudo no arquivo de texto para minúsculo, usando sed. Isso significa que a primeira frase seria "eu tenho um arquivo de texto no qual algumas palavras são impressas em maiúsculas".

magnetar
fonte
6
você está ciente do trcomando? Às vezes é mais adequado do que sed.
Bryan Oakley
@Bryan Oakley Eu não estava até agora. Obrigado por apontar isso. Mas como usá-lo para fazer o que estava pedindo?
magnetar
procure no link fornecido na resposta de Raghuram.
Bryan Oakley
1
se você deve usar sed, cat <input> | sed 'y / ABCDEFÑØÅÆŒ / abcdefñøåæœ /' <- Você deve detalhar todos os caracteres, maiúsculas e minúsculas. Sei que é complicado escrever todos esses personagens, mas também funcionará com todos os caracteres especiais internacionais. :)
Arno Teigseth

Respostas:

248

Com 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

Funciona usando o GNU sed(o BSD sednão suporta \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
magnetar
fonte
6
Eu tive que escolher minha própria resposta porque não sou fã de respostas que consistem apenas em links.
magnetar
6
O OSX também não suporta as extensões GNU :(
ekkis 3/17/17
2
sed -e 's/.*/\L&/' input.txt > output.txtpara o GNU sed obras bem também
Asfand Qazi
1
@ekkis OSX está usando BSD (como mencionado, o BSD sed não suporta). Tente ler a linha superior man sedpara saber qual versão você está usando.
Ryder
Por alguma razão quando eu usar o seu padrão de maiúsculas, ele adiciona um Una frente de cada linha
Xtremefaith
51

Se você possui extensões GNU, pode usar \ sed's \ L (diminuir toda a correspondência ou até que \ L [lower] ou \ E [end - alternar com maiúsculas e minúsculas] seja atingido), assim:

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

Nota: '&' significa o padrão de correspondência completa.

Como uma observação lateral, as extensões GNU incluem \ U (superior), \ u (próximo caractere superior da correspondência), \ l (próximo caractere inferior da correspondência). Por exemplo, se você quisesse camelcase uma 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: Como se supõe que temos extensões GNU, também podemos usar a opção dash-r (expressões regulares estendidas), que permite \ w (caractere de palavra) e alivia você de ter que escapar dos parênteses de captura e um ou mais quantificador (+). (Além: \W [non-word], \s [whitespace], \S [non-whitespace]também são compatíveis com o traço-R, mas \d [digit]e \D [non-digit]não são).

Luv2code
fonte
1
Dica muito útil. Descobri que os parênteses redondos não são necessários no exemplo de camelo. 's / \ w + / \ u & / g' também funciona.
PJ_Finnegan
1
sed -ri 's/MATCH_WHATEVER/\L&/i' input-file.ext- o uso do /imodificador torna a correspondência sem distinção entre maiúsculas e minúsculas e, portanto, é opcional. A -iopção informa ao sed para alterar o arquivo no local. Não há necessidade de redirecionar a saída para outro arquivo, se você não precisar.
Jim
1
Eu realmente precisava disso \E [end - toggle casing off]. Obrigado !
Mehdi Yedes 14/02
37

Você também pode fazer isso com muita facilidade awk, se quiser considerar uma ferramenta diferente:

echo "UPPER" | awk '{print tolower($0)}'
whitehat237
fonte
1
Sua melhor resposta, porque o trabalho com cirílico. tr: - não funcionou com ele.
Amaroc 27/03
2
Cuidado com os personagens com sotaques. tolowernão será capaz de lidar com À, por exemplo
Sam Houston
Você pode renomear um monte de arquivos com esse comando: ls | awk '{print "mv " $0 " " tolower($0)}' | sh
Neekobus
15

Aqui estão muitas soluções:

Para o upercaser com 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)}'

Para minúsculas com 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)}'

Partida complicada para minúscula:

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

Partida complicada para maiúscula:

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

Simples bash para minúsculas:

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

Simples bash para maiúsculas:

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

Observe que $ {v,} e $ {v ^} alteram apenas a primeira letra.

Você deve usá-lo dessa maneira:

(while read v;do echo "${v,,}"; done) < input_file.txt > output_file.txt
Vouze
fonte
7
echo  "Hello  MY name is SUJIT "  | sed 's/./\L&/g'

Resultado:

olá meu nome é sujit
Sujit Dhamale
fonte
5

Eu gosto de algumas das respostas aqui, mas há um comando sed que deve executar o truque em qualquer plataforma:

sed 'y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/'

Enfim, é fácil de entender. E conhecer o comando y pode ser útil algumas vezes.

Dennis
fonte
2
Isso não funciona para arbitrárias caracteres internacionais, mas funciona para caracteres ASCII no OS / X
emrys57
Certamente fez o trabalho para mim. Eu tenho que admitir que foi a primeira vez que usei o comando y. Obrigado!
monsune 14/01
4

Se você estiver usando o posix sed

Seleção para qualquer caso de um padrão (convertendo o padrão pesquisado com este sed que use o padrão convertido no comando desejado 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}"

converter em minúsculas

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"

o mesmo para maiúsculas, substitua a letra minúscula entre // pelo equivalente superior no sed

Diverta-se

NeronLeVelu
fonte
(Achei que este funcionou melhor no MacOS) - Bom, meu amigo - mas um pequeno topo - você tem o caso Jj ao contrário. Deve ser 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
Não sei por que você precisa fazer algo tão trabalhoso. Estou assumindo que o Mac OS não possui extensões GNU, mas se você está decidido a usar o sed, em vez de substituir (s), você pode usar a transliteração ('y') da seguinte forma: sed 'y / ABCDEFGHIJKLMNOPQRSTUVWXYZ / abcdefghijklmnopqrstuvwxyz / '
Luv2code
o objetivo era selecionar qualquer padrão de texto que se parecem com um caso inferior / superior de um não GNU sed sem alterar o conteúdo da fonte de dados (a y//alterar o conteúdo de origem ou poderia faltar o padrão de busca.
NeronLeVelu
3

curta, doce e você nem precisa de redirecionamento :-)

perl -p -i -e 'tr/A-Z/a-z/' file
pedrito
fonte
Bem, tentei usar isso com um olhar para trás e, de alguma forma, substituiu a maioria das letras em meus arquivos por outras letras maiúsculas aleatórias. Dei uma boa risada de qualquer maneira. Eu era capaz de derivar o que eu queria disso resposta também sobre perl: askubuntu.com/a/527073/250556
ThorSummoner