2009-03-27 18 views
20

me gustaría cambiar los siguientes patrones:mayúsculas a minúsculas usando sed

getFoo_Bar 

a:

getFoo_bar 

(nota de la b inferior)

Sabiendo ni foo ni barra, ¿cuál es el patrón de reemplazo?

empecé a escribir

sed 's/\(get[A-Z][A-Za-z0-9]*_\)\([A-Z]\)/\1 

pero estoy atascado: Quiero escribir "\ 2 minúscula", ¿cómo puedo hacer eso?

¿Quizás sed no está adaptado?

Respuesta

24
s/\(get[A-Z][A-Za-z0-9]*_\)\([A-Z]\)/\1\L\2/g 

prueba:

$ echo 'getFoo_Bar' | sed -e 's/\(get[A-Z][A-Za-z0-9]*_\)\([A-Z]\)/\1\L\2/g' 
getFoo_bar 
+1

Para ampliar la respuesta, esta es la expresión general para convertir a minúsculas todos los caracteres: 'echo getFoo_Bar | sed -e 's/\ ([A-Z] [A-Za-z0-9] * \)/\ L \ 1/g'', que produce 'getfoo_bar' – espinchi

+7

Tenga en cuenta que esta solución solo funciona con GNU sed. No hay '\ l' /' \ L'/'\ u' /' \ U'/'\ E' en POSIX sed. En este caso, podría usar perl (consulte la respuesta de [@ user83591 a esta pregunta] (http://stackoverflow.com/a/689620/2451238)) o awk (consulte [mi respuesta a otra pregunta] (http: // stackoverflow). .com/a/18298882/2451238)). – mschilli

1

Usted puede utilizar Perl para éste:

perl -pe 's/(get[A-Z][A-Za-z0-9]*)_([A-Z])/\1_\l\2/' 

El \ l es el truco aquí.

sed no hace mayúsculas/minúsculas en grupos coincidentes.

7

algo más corta:

echo getFoo_Bar | sed 's/_\(.\)/_\L\1/' 
+0

¿Qué tal '' s/\ (_. \)/\ L \ 1/'? – Beta

+0

dulce! busqué algo como esto en todas partes +1 –

33

Para cambiar getFoo_Bar a getFoo_bar usando sed:

echo "getFoo_Bar" | sed 's/^\(.\{7\}\)\(.\)\(.*\)$/\1\l\2\3/' 

Las letras mayúsculas y minúsculas son manejados por:

  • \U Hace que todo el texto a la mayúscula derecha.
  • \u hace solo el primer caracter a la mayúscula derecha.
  • \L Convierte todo el texto a la derecha en minúscula.
  • \l Hace solo el primer carácter en la minúscula derecha. (Tenga en cuenta que es una letra minúscula L)

El ejemplo es solo un método para la coincidencia de patrones, solo se basa en la modificación de un solo fragmento de texto. Usando el ejemplo, getFoo_BAr se transforma en getFoo_bAr, tenga en cuenta que A no fue alterado.

+1

¿Hay alguna manera de hacer que las cosas vuelvan a la normalidad después de un comando \ L? – Benjamin

+4

De http://www.gnu.org/software/sed/manual/sed.html: '\ E' _Depende de la conversión del caso iniciada por_' \ L' _or_ '\ U'. –

+2

Esta es una gran respuesta que va mucho más allá de responder la pregunta original. Proporciona información de referencia sobre el manejo de todo tipo de tareas de transformación de casos en sed. Me ahorró mucho tiempo de investigación. ¡Gracias! – rustyx

5

más corta que puedo llegar a:

echo getFoo_Bar | sed 's/_./\L&/' 
+1

¿Qué hacen los '**' 's? – potong

-2
echo getFoo_Bar | sed 's/[Bb]/\L&/g' 
+0

Te perdiste el punto. Estás haciendo una búsqueda/reemplazo global aquí, no la que está después del guión bajo. –

0

Si desea escribir todo en minúsculas justo después de subrayado, que esto iba a funcionar para usted:

echo getFoo_Bar | gawk -F_ '{print tolower($2)}' 
Cuestiones relacionadas