web-dev-qa-db-fra.com

majuscule à minuscule en utilisant sed

Je voudrais changer les modèles suivants:

getFoo_Bar

à:

getFoo_bar

(notez le b inférieur)

Ne connaissant ni foo ni barre, quel est le modèle de remplacement?

J'ai commencé à écrire

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

mais je suis coincé: je veux écrire "\ 2 minuscules", comment puis-je faire cela?

Peut-être que sed n'est pas adapté?

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

Tester:

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

Pour modifier getFoo_Bar en getFoo_bar à l'aide de sed:

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

Les lettres majuscules et minuscules sont gérées par:

  • \U Met tout le texte en majuscule à droite.
  • \u fait que le premier caractère à la droite majuscule.
  • \L Met tout le texte en bas à droite.
  • \l Ne met que le premier caractère en minuscule à droite. (Notez que c'est une lettre minuscule L)

L'exemple n'est qu'une méthode de correspondance de modèle, basée sur la modification d'un seul bloc de texte. En utilisant l'exemple, getFoo_BAr se transforme en getFoo_bAr, notez que le A n'a pas été modifié.

33
Matt Thomas

Un peu plus court:

echo getFoo_Bar | sed 's/_\(.\)/_\L\1/'
7
kalyanji

Le plus court je peux venir avec:

echo getFoo_Bar | sed 's/_./\L&/'
6
Dušan

Vous pouvez utiliser Perl pour celui-ci:

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

Le\l est le truc ici.

sed ne fait pas de majuscules/minuscules sur les groupes correspondants.

1
brian-brazil

Si vous voulez tout écrire en minuscule juste après le trait de soulignement, cela fonctionnera pour vous:

echo getFoo_Bar | gawk -F_ '{print tolower($2)}'
0
user2923416
0
Nik