LinuxQuestions.org

LinuxQuestions.org (/questions/)
-   Programming (http://www.linuxquestions.org/questions/programming-9/)
-   -   variable substitution in sed (http://www.linuxquestions.org/questions/programming-9/variable-substitution-in-sed-655628/)

gaynut 07-14-2008 07:26 AM

variable substitution in sed
 
Hi,

This is a simple stuff yet i couldn't solve it myself.
The issue goes as below,

i need to place fprintf after every pattern matched in a C code.
eg: if a c code has

Alloc(ALLOCID_2x0023);
then a printf should be placed after the line as below

fprintf (stderr,"Accessing alloc id %x", ALLOCID_2x0023);

there are list of files to be modified whose list is there in the "file_list". the pattern to be searched are there in "alloc_ids".


i wrote a code,

while read line
do
while read line1
do
grep $line $line1
if [ $? -eq 0 ]
then
##echo " The $line in file $line1"
sed '/Alloc(/a\
fprintf(stderr,"Acccesing alloc id %x",$line);' < $line1 > $line1.swp

fi


done <file_list
done <alloc_ids



The problem is, i'm not able to do variable substitution for the variable "$line" which has the pattern.

If i put quotes instead of single quote for the sed, it throws an error "cannot parse ...bla..bla.."

On the whole , it just writes the entire fprintf line as a string in the new file inclusive of $line being written as such without any substitution.



Any help would be appreciated..please


thanks,

~ gaynut

pixellany 07-14-2008 08:38 AM

The normal single quotes used with SED will not allow the shell to expand a variable name--eg "$var". To fix this, use double-quotes for SED. Then, if you need the (SED) special meaning of "$" (end of line), you would escape it with "\".

Keep in mind that--in many situations--quoting is not required at all. Many books say "use single-quotes to be on the safe side", but you have to then recognize when the single-quotes won't work.

Any kind of quoting is only required to prevent a process from interpreting one or more characters rather than passing it on the next process.


All times are GMT -5. The time now is 04:18 AM.