tags:

views:

3199

answers:

5

Hi, I'd like to change the following patterns:

getFoo_Bar

to:

getFoo_bar

(note the lower b)

Knowing neither foo nor bar, what is the replacement pattern?

I started writing

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

but I'm stuck: I want to write "\2 lower case", how do I do that?

Maybe sed is not adapted?

A: 

From the FAQ: How do I convert a string to all lowercase or capital letters?

Nik
I don't want an all-capitalized string! sorry.
cadrian
+3  A: 
s/\(get[A-Z][A-Za-z0-9]*_\)\([A-Z]\)/\1\L\2/g

Test:

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

You can use perl for this one:

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

The \l is the trick here.

sed doesn't do upper/lowercase on matched groups.

+1  A: 

Somewhat shorter:

echo getFoo_Bar | sed 's/_\(.\)/_\L\1/'
kalyanji
How about `'s/\(_.\)/\L\1/`?
Beta
+2  A: 

To change getFoo_Bar to getFoo_bar using sed :

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

The upper and lowercase letters are handled by :

  • \U Makes all text to the right uppercase.
  • \u makes only the first character to the right uppercase.
  • \L Makes all text to the right lowercase.
  • \l Makes only the first character to the right lower case. (Note its a lowercase letter L)

The example is just one method for pattern matching, just based on modifying a single chunk of text. Using the example, getFoo_BAr transforms to getFoo_bAr, note the A was not altered.

Matt Thomas
Is there some way to make things go back to normal after an \L command?
Benjamin