site Search:


 
    All Forums Hot Topics Gallery






how-to block ads


 
Search Topic:
Uniqs:
5725
Share Topic
Posting?
Post a:
Post a:
Links: ·Forum FAQ ·Attitude Adjustment ·Linux docs ·DistroWatch ·OPLM ·FreeBSD Handbook
AuthorAll Replies


Maxo
Your tax dollars at work.
Premium,VIP
join:2002-11-04
Tallahassee, FL

Make variables uppercase in bash.

I am trying to take part of a string and make it uppercase. For example:
export var='abcdefg'
echo ${var:2:1}

With the exception that I need this to return 'C', not 'c'. The only thing I have been able to find are commands that take a whole file as a parameter and makes it all uppercase. Can anyone help me do this please?


pflog
Bueller? Bueller?
Premium,MVM
join:2001-09-01
El Dorado Hills, CA
kudos:3

I suppose you can't use tr?

echo ${var:2:1} | tr 'a-z' 'A-Z'

would work, but I take it you want to avoid using tr?
--
He who is not contented with what he has, would not be contented with what he would like to have. -Socrates



Maxo
Your tax dollars at work.
Premium,VIP
join:2002-11-04
Tallahassee, FL

All the examples of tr that I saw had to take files. I didn't think about using pipes. I think that should work. I'll try it and let you know.



pflog
Bueller? Bueller?
Premium,MVM
join:2001-09-01
El Dorado Hills, CA
kudos:3

oh ok! cool, should do the trick.



Maxo
Your tax dollars at work.
Premium,VIP
join:2002-11-04
Tallahassee, FL

I think I may need to be a little more specific. We are writing a bash script that reads some stuff and builds a control file for Oracle's sqlldr, and then we execute sqlldr with the build control file. Our code looks much like this:

   if [ "${LINE}" = "amico.990120" ];  then       
      echo Building amic control file for ${LINE}
      echo LOAD DATA               > file_loader.ctl
      echo INFILE \'${LINE}\'      >> file_loader.ctl
      echo APPEND                  >> file_loader.ctl
      echo INTO TABLE schema.table >> file_loader.ctl
      echo "("                     >> file_loader.ctl
      echo " column1(1:2),"        >> file_loader.ctl
      echo " column2(3:4),"        >> file_loader.ctl
      echo " column3 CONSTANT '" ${LINE:4:1} | tr 'a-z' 'A-Z' "'," >> file_loader.ctl
      echo ")"                     >> file_loader.ctl
      sqlldr user/pass@database file_loader.ctl log=sqlldr.log silent=FEEDBACK
    else
      echo No Amic file found
    fi
  done < myAmicFiles
 

The myAmicFiles just looks like this:
amici.990120
amici.990220
amico.990520
amico.990620

I need the i or o to be uppercase.

--
"Padre, nobody said war was fun now bowl!" - Sherman T Potter

»www.cafepress.com/maxolasersquad

»maxolasersquad.com/

»maxolasersquad.com/network/ My DSL Network Guide

»myspace.com/mlsquad


pflog
Bueller? Bueller?
Premium,MVM
join:2001-09-01
El Dorado Hills, CA
kudos:3

Looks like a good place for a perl script.



Maxo
Your tax dollars at work.
Premium,VIP
join:2002-11-04
Tallahassee, FL

said by pflog:

Looks like a good place for a perl script.
If you knew what Perl and I had been through the last two and a half weeks you wouldn't joke like that.


pflog
Bueller? Bueller?
Premium,MVM
join:2001-09-01
El Dorado Hills, CA
kudos:3

said by Maxo:

said by pflog:

Looks like a good place for a perl script.
If you knew what Perl and I had been through the last two and a half weeks you wouldn't joke like that.
heh! ok, well let me take a look.
--
He who is not contented with what he has, would not be contented with what he would like to have. -Socrates


pflog
Bueller? Bueller?
Premium,MVM
join:2001-09-01
El Dorado Hills, CA
kudos:3

reply to Maxo
So in this line:

quote:
echo " column3 CONSTANT '" ${LINE:4:1} | tr 'a-z' 'A-Z' "'," >> file_loader.ctl

You want just the capital letter?

E.g. for LINE = amico.990120 you want just the O?

Or do you want amicO.990120 ?
--
He who is not contented with what he has, would not be contented with what he would like to have. -Socrates


pflog
Bueller? Bueller?
Premium,MVM
join:2001-09-01
El Dorado Hills, CA
kudos:3

reply to Maxo
Probably the easiest thing to do would be to set a variable for the letter first, then just use that variable.

e.g instead of:

bash code:

echo " column3 CONSTANT '" ${LINE:4:1} | tr 'a-z' 'A-Z' "'," >> file_loader.ctl

try:

bash code:
the_char=`echo ${LINE:4:1} | tr a-z A-Z`
echo " column3 CONSTANT '$the_char'," >> file_loader.tcl

Again, assuming you just want the O there and not the full name. If you want the full name, it'd be slightly more involved but not terribly so.

--
He who is not contented with what he has, would not be contented with what he would like to have. -Socrates


Sir Meowmix III

@windstream.net

reply to Maxo
What about using sed?

s/i/I/g s/o/O/g



pflog
Bueller? Bueller?
Premium,MVM
join:2001-09-01
El Dorado Hills, CA
kudos:3

said by Sir Meowmix III :

What about using sed?

s/i/I/g s/o/O/g
Good call, that'd work, if he anchor'd it to the ".", e.g.:

bash code:
... | sed 's/o\./O./g' | sed 's/i\./I\./g'

--
He who is not contented with what he has, would not be contented with what he would like to have. -Socrates


Sir Meowmix III

@windstream.net

reply to Maxo
Agree, good call, at that point the regex would be positional on the file extension.



Maxo
Your tax dollars at work.
Premium,VIP
join:2002-11-04
Tallahassee, FL

reply to pflog
the_char=`echo ${LINE:4:1} | tr a-z A-Z`
The above line just returns the given string literal, not the results of the echo.



Maxo
Your tax dollars at work.
Premium,VIP
join:2002-11-04
Tallahassee, FL

reply to Sir Meowmix III
I've never used sed before and have only recently began reading up on regular expressions.
I read through the man pages and looked at the code you gave. It appears to work with the following code:

echo $LINE | sed 's/o\./O\./g' | sed 's/i\./I\./g'
 

The only thing that is missing is how to take the result of this output and store it in a variable.

--
"Padre, nobody said war was fun now bowl!" - Sherman T Potter

»www.cafepress.com/maxolasersquad

»maxolasersquad.com/

»maxolasersquad.com/network/ My DSL Network Guide

»myspace.com/mlsquad


Sir Meowmix III

@205.255.240.x

MYVAR=$(echo $LINE | sed 's/o\./O\./g' | sed 's/i\./I\./g')
 
echo $MYVAR
 


Maxo
Your tax dollars at work.
Premium,VIP
join:2002-11-04
Tallahassee, FL

said by Sir Meowmix III :

[code]
MYVAR=$(echo $LINE | sed 's/o\./O\./g' | sed 's/i\./I\./g')

echo $MYVAR
[/code]
That did it. Thanks a lot. You can probably tell that we just started learning how to write these scripts a few weeks ago.


Sir Meowmix III

@205.255.240.x

reply to Maxo
Glad to help Maxo. Feel free to ask for help anytime you get stuck.



nixen
Rockin' the Boxen
Premium
join:2002-10-04
Alexandria, VA

1 edit

reply to Maxo

said by Maxo:

I've never used sed before and have only recently began reading up on regular expressions.
I read through the man pages and looked at the code you gave. It appears to work with the following code:
echo $LINE | sed 's/o\./O\./g' | sed 's/i\./I\./g'
 

The only thing that is missing is how to take the result of this output and store it in a variable.

VAR=`$LINE | sed -e 's/o\./O\./g' -e 's/i\./I\./g'`
 

Or even:
VAR=`$LINE | sed '{
                     s/o\./O\./g
                     s/i\./I\./g
                  }'`
 
--
The trouble with the world is that the stupid are cocksure and the intelligent are full of doubt. -- Bertrand Russell

Friday, 01-Jun 08:37:45 Terms of Use & Privacy | feedback | contact | Hosting by nac.net - DSL,Hosting & Co-lo
over 12.5 years online © 1999-2012 dslreports.com.
Most commented news this week
Hot Topics