Converte o conteúdo do arquivo em minúscula

77

Eu tenho o arquivo temp com alguns conteúdos em minúsculas e maiúsculas.

Entrada

Conteúdo do meu arquivo temp :

hi
Jigar
GANDHI
jiga

Eu quero converter todos os upper para lower .

Comando

Eu tentei o seguinte comando:

sed -e "s/[A-Z]/[a-z]/g" temp

mas obteve resultados errados.

Saída

Eu quero isso como:

hi
jigar
gandhi
jiga

O que precisa estar na parte do argumento substituto para sed ?

    
por JigarGandhi 05.12.2014 / 08:32

6 respostas

111

Se a sua entrada contiver apenas caracteres ASCII, você pode usar tr como:

tr A-Z a-z < input 

ou (menos fácil de lembrar e digitar IMO, mas não limitado a letras latinas ASCII):

tr '[:upper:]' '[:lower:]' < input

se você tiver que usar sed :

sed 's/.*/\L/g' < input

(aqui assumindo a implementação do GNU).

    
por 05.12.2014 / 08:43
25

Usando o vim, é super simples:

$ vim filename
gg0guGZZ

Abre o arquivo, gg vai para a primeira linha, 0 , primeira coluna. Com guG , reduz o caso de todos os caracteres até o final do arquivo. ZZ salva e sai.

Ele deve lidar com praticamente qualquer coisa que você jogue; ignorará números, lidará com não ASCII.

Se você quisesse fazer o oposto, coloque as letras maiúsculas em maiúsculas, troque a u por U : gg0gUGZZ e está pronto.

    
por 05.12.2014 / 19:20
17

Eu gosto de dd para isso, eu mesmo.

<<\IN LC_ALL=C 2>/dev/null \
dd conv=lcase
hi
Jigar 
GANDHI
jiga
IN

... fica ...

hi
jigar
ghandi
jiga

O LC_ALL=C é para proteger quaisquer multibytes na entrada - embora quaisquer capitais multibyte não sejam convertidos. O mesmo é verdade para (GNU) tr - ambos os aplicativos são propensos a entrada mutilada em qualquer localidade não-C. iconv pode ser combinado com uma solução abrangente.

O 2>/dev/null de redirecionamento descarta o relatório de status padrão de dd - e seu stderr. Sem ele, dd seguiria a conclusão de um trabalho como o acima, com informações de impressão, como quantos bytes foram processados e etc.

    
por 05.12.2014 / 10:54
12

Você também pode usar o Perl 5:

perl -pe '$_=lc' temp

A opção -p diz ao perl para executar a expressão especificada uma vez para cada linha de entrada, imprimindo o resultado, ou seja, o valor final de $_ . -e indica que o programa será o próximo argumento, ao contrário de um arquivo que contém o script. lc converte em minúsculas. Sem um argumento, ele funcionará em $_ . E $_= salva isso novamente para que seja impresso.

Uma variação disso seria

perl -ne 'print lc' temp

Usar -n é como -p , exceto que $_ não será impresso no final. Então, em vez de salvar para essa variável, estou incluindo uma instrução impressa explícita.

Um benefício do Perl em contraste com o sed é que você não precisa de nenhuma extensão GNU. Existem projetos que precisam ser compatíveis com ambientes não-GNU, mas que também já possuem uma dependência do Perl. Comparado com tr , pode ser que Perl lc possa ser mais facilmente reconhecido pelo código de idioma. Veja a página perllocale man para detalhes.

    
por 05.12.2014 / 10:39
9

Você precisa capturar o padrão correspondente e usá-lo na substituição por um modificador:

sed 's/\([A-Z]\)/\L/g' temp

O \(...\) "captura" o texto correspondente, a primeira captura vai para , a próxima para , etc. A numeração está de acordo com os colchetes de abertura no caso de capturas aninhadas.

O \L converte o padrão capturado em minúscula, e também há \U para letras maiúsculas.

    
por 05.12.2014 / 08:46
0

Além da resposta do MvG, você também pode usar o Perl 6:

perl6 -pe .=lc temp

Aqui $ _ é implícito, e você não precisa das aspas simples para protegê-lo da expansão pelo shell ($ _ sendo um parâmetro Bash especial; veja: link )

    
por 31.03.2018 / 12:09