¿Hay alguna forma de poner en mayúsculas / minúsculas solo un carácter en alguna cadena?
Ejemplo de entrada:
syslog_apr_24_30
syslog_mar_01_17
Salida deseada:
syslog_Apr_24_30
syslog_Mar_01_17
Tenga en cuenta por favor el principio mayúscula del mes.
Lo he intentado awk
pero no soy lo suficientemente bueno para que funcione.
sed 's/_./\U&/'
awk:
fuente
Awk
versión con subcadenas y toupperEjecución de muestra:
fuente
Utilizando
awk
:o
Ejemplo
fuente
Aquí hay un enfoque de Perl:
La
-p
causa cada línea impresa después de aplicar a la secuencia de comandos dada por-e
. La sustitución reemplaza la primera instancia de_
y el carácter que la sigue con ellos mismos ($&
es lo que fue emparejado) mayúscula (uc()
), se necesitae
al final del operador de sustitución (s///e
) para evaluar las expresiones.fuente
Otro
perl
:fuente
Pure Bash 4.x, utilizando una expresión regular para seleccionar la parte que desea aumentar y el
^^
operador de mayúsculas en esa parte. Tachado en la parte delantera y trasera (emparejado por. *) Para volver a crear la cadena completa:Si no recuerda todas las reglas de comillas, es seguro citar todo excepto la expresión regular (que haría
=~
una coincidencia de cadena literal).El
^
operador upcase-first solo funciona al comienzo de una variable (o elemento de matriz). Y no parece haber ninguna expansión de subcadena que le proporcione lo que Perl llamaría un valor (que puede asignar / modificar). Los operadores de mayúsculas / minúsculas pueden tomar un patrón que coincida por carácter, pero eso no ayuda a saltarsyslog_
, ya que hay nombres de meses que comienzan con caracteres en "syslog".De todos modos, esto podría ser más rápido que
foo="$(echo "$foo" | sed 's/_./\U&/')"
(publicado como un comentario a la respuesta aceptada, por Glenn Jackman).Bash, sed o awk serán MUCHAS veces más rápido que perl. Si comienza a encontrar varias líneas de unl perl útiles en un script de shell, simplemente debe escribir todo en perl.
fuente
Si el mes siempre sigue al primer "_" (guión bajo), entonces use esto (como se muestra en otras respuestas):
Si puede haber otros guiones bajos antes del anterior al mes, entonces lo anterior no funcionará.
Si el mes siempre comienza con el octavo carácter, use esto:
fuente