Eu tenho um temp
arquivo com alguns conteúdos em minúsculas e maiúsculas.
Entrada
Conteúdo do meu temp
arquivo:
hi
Jigar
GANDHI
jiga
Eu quero converter tudo superior para inferior .
Comando
Eu tentei o seguinte comando:
sed -e "s/[A-Z]/[a-z]/g" temp
mas tem saída errada.
Resultado
Quero como:
hi
jigar
gandhi
jiga
O que precisa estar na parte substituta do argumento sed
?
Respostas:
Se sua entrada contiver apenas caracteres ASCII, você poderá usar
tr
como:ou (menos fácil de lembrar e digitar IMO; mas não limitado a letras latinas ASCII, embora em algumas implementações incluindo GNU
tr
, ainda limitado a caracteres de byte único, portanto nos locais UTF-8, ainda limitado a letras ASCII):se você precisar usar
sed
:(assumindo aqui a implementação GNU).
Com o POSIX
sed
, você precisa especificar todas as transliterações e escolher as letras que deseja converter:Com
awk
:fonte
\L
é uma extensão GNU.\L
funciona bem para mim até agora. En iluminar o ponto que você está tentando fazer extensão GNUsed
é um comando Unix. Sistemas diferentes têm variantes diferentes com comportamento e funcionalidade diferentes. Felizmente, hoje em dia, existe um padrão mais adequado para que você possa contar com um conjunto mínimo de recursos comuns a todos.\L
não está entre eles e foi introduzido pelo GNUsed
(corresponde ao mesmo operador no padrãoex
/vi
) e geralmente não está disponível em outras implementações.tr
implementações como o GNUtr
não funcionam corretamente em locais de vários bytes (a maioria deles atualmente, tenteecho STÉPHANE | tr '[:upper:]' '[:lower:]'
por exemplo). Nos sistemas GNU, você pode preferir ased
variante ouawk
'stolower()
.sed 's/.*/\L&/g' < input
. A\1
referência à substring correspondente não funcionará, a menos que você especifique a substring entre parênteses, como o wurtle faz no dele. No entanto, é um pouco mais limpo de usar&
para representar a partida inteira, como mostradoUsando o vim, é super simples:
Abre o arquivo,
gg
vai para a primeira linha0
, primeira coluna. ComguG
, reduz o caso de todos os caracteres até a parte inferior do arquivo.ZZ
salva e sai.Ele deve lidar com praticamente qualquer coisa que você jogar nele; ignorará números, tratará não ASCII.
Se você quiser fazer o oposto, transforme as letras minúsculas em maiúsculas, troque a
u
saída por aU
:gg0gUGZZ
e pronto.fonte
vim file1 file2 fileetc
e, em seguida, algo como:bufdo gg0guG:w<CR>
seria provavelmente funcionar para qualquer número de arquivos. Ainda não testei isso!Eu gosto
dd
disso também.... fica ...
O
LC_ALL=C
objetivo é proteger todos os multibytes na entrada - embora as letras maiúsculas e minúsculas não sejam convertidas. O mesmo vale para (GNU)tr
- os dois aplicativos são propensos a entrada de dados em qualquer local não C.iconv
pode ser combinado com qualquer um para uma solução abrangente.O
2>/dev/null
redirecionamento descartadd
o relatório de status padrão - e seu stderr. Sem issodd
, seguiria a conclusão de um trabalho como o acima, com informações de impressão, como quantos bytes foram processados e etc.fonte
tr
quando se lida com arquivos grandes, obrigado!Você também pode usar o Perl 5:
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, em oposição a um arquivo que contém o script.lc
converte para minúsculas. Sem argumento, ele funcionará$_
. E$_=
salva isso novamente para que seja impresso.Uma variação disso seria
Usar
-n
é como,-p
exceto que$_
não será impresso no final. Então, em vez de salvar nessa variável, estou incluindo uma declaração de impressão 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 Perl como dependência. Comparado com
tr
, pode ser que o Perllc
possa ser mais facilmente reconhecido pelo local. Veja aperllocale
página de manual para detalhes.fonte
Você precisa capturar o padrão correspondente e usá-lo na substituição com um modificador:
As
\(...\)
"capturas" do texto correspondente em anexo, a primeira captura\1
, a próxima a\2
etc. A numeração é de acordo com colchetes de abertura no caso de capturas aninhadas.O
\L
converte o padrão capturado em minúsculas, e também\U
em maiúsculas.fonte
&
Além da resposta do MvG, você também pode usar o Perl 6:
perl6 -pe .=lc temp
Aqui $ _ está implícito e você não precisa de aspas simples para protegê-lo da expansão pelo shell ($ _ sendo um parâmetro Bash especial; consulte: https://www.gnu.org/software/bash/manual/ html_node / Special-Parameters.html )
fonte