Existe uma maneira de colocar em maiúsculas / minúsculas apenas um caractere em alguma string?
Exemplo de entrada:
syslog_apr_24_30
syslog_mar_01_17
Saída desejada:
syslog_Apr_24_30
syslog_Mar_01_17
Observe o início em maiúsculas do mês.
Eu tentei, awk
mas não sou bom o suficiente para fazê-lo funcionar.
sed 's/_./\U&/'
awk:
fonte
Awk
versão com substrings e toupperExemplo de execução:
fonte
Usando
awk
:ou
Exemplo
fonte
Aqui está uma abordagem Perl:
Isso
-p
faz com que cada linha seja impressa após a aplicação do script fornecido por-e
. A substituição substitui a primeira instância de_
e o caractere que a segue por si mesmos ($&
é o que correspondeu) em maiúsculas (uc()
),e
no final do operador de substituição (s///e
) é necessário para avaliar expressões.fonte
Outro
perl
:fonte
Pure Bash 4.x, usando uma regex para selecionar a parte que você deseja upcase e o
^^
operador upcase nessa parte. Tachas na frente e nas costas (correspondidas por. *) Para recriar toda a sequência:Se você não se lembrar de todas as regras de citação, é seguro citar tudo, exceto a expressão regular (o que faria
=~
uma correspondência literal de seqüência de caracteres).O
^
operador upcase-first funciona apenas no início de uma variável (ou elemento da matriz). E não parece haver nenhuma expansão de substring que fornece o que o perl chamaria de lvalue (que você pode atribuir / modificar). Os operadores up / downcase-first podem usar um padrão correspondente por caractere, mas isso não ajuda a pularsyslog_
, porque existem nomes de meses que começam com caracteres no "syslog".De qualquer forma, isso pode ser mais rápido do que
foo="$(echo "$foo" | sed 's/_./\U&/')"
(postado como um comentário para a resposta aceita, por Glenn Jackman).Bash, sed ou awk serão MUITO vezes mais rápidos que o perl. Se você começar a encontrar várias linhas de comando perl úteis em um script de shell, escreva tudo em perl.
fonte
Se o mês sempre seguir o primeiro "_" (sublinhado), use-o (como mostrado em outras respostas):
Se houver outros sublinhados antes do anterior ao mês, os itens acima não funcionarão.
Se o mês sempre começa com o 8º caractere, use o seguinte:
fonte