Tutorial :upper- to lower-case using sed



Question:

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?


Solution:1

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  


Solution:2

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.


Solution:3

Somewhat shorter:

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


Solution:4

Shortest I can come up with:

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


Solution:5

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.


Solution:6

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


Solution:7

If you want to write everything in lowercase just after underscore, than this would work for you:

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


Solution:8

echo getFoo_Bar | sed 's/[Bb]/\L&/g'  

Note:If u also have question or solution just comment us below or mail us on toontricks1994@gmail.com
Previous
Next Post »