Using a variable in sed command


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting Using a variable in sed command
# 1  
Old 11-07-2016
Using a variable in sed command

Hi All,

Please help me with the below problem
Code:
if [ "$a" == "RAHUL" ]
then
$a=" "
fi

echo "ABC1abc" | sed 's/a/'$a'/'

The required output is :
Code:
ABC abc

But I am getting the below error:
Code:
sed: -e expression #1, char 4: unterminated `s' command

Please help.
# 2  
Old 11-07-2016
Quote:
Originally Posted by rahulsk
Hi All,

Please help me with the below problem
Code:
if [ "$a" == "RAHUL" ]
then
$a=" "
fi

echo "ABC1abc" | sed 's/a/'$a'/'

The required output is :
Code:
ABC abc

But I am getting the below error:
Code:
sed: -e expression #1, char 4: unterminated `s' command

Please help.
I don't understand what you're trying to do. Why would a script that attempts to use a sed substitute command to replace the 1st occurrence of the character a with the contents of an undefined variable be expected to change the digit 1 in your sample input to a <space> character???

If you want to change the 1st occurrence of the digit 1 on each input line to the value you have assigned to the shell variable a (assuming that $a does not expand to a string containing any /, \, &, or NUL characters; you could use:
Code:
a="some string"
echo "ABC1abc" | sed "s/1/$a/"

Note that unless you quote the entire substitute command, you can't include blanks in the substitution string because the shell will see sequences of blanks in the substitute command as field separators; not as data included in the replacement string.

Last edited by Don Cragun; 11-07-2016 at 08:24 PM.. Reason: add missing space between sed and its operand
# 3  
Old 11-07-2016
Quote:
Originally Posted by Don Cragun
I don't understand what you're trying to do. Why would a script that attempts to use a sed substitute command to replace the 1st occurrence of the character a with the contents of an undefined variable be expected to change the digit 1 in your sample input to a <space> character???

If you want to change the 1st occurrence of the digit 1 on each input line to the value you have assigned to the shell variable a (assuming that $a does not expand to a string containing any /, \, &, or NUL characters; you could use:
Code:
a="some string"
echo "ABC1abc" | sed"s/1/$a/"

Note that unless you quote the entire substitute command, you can't include blanks in the substitution string because the shell will see sequences of blanks in the substitute command as field separators; not as data included in the replacement string.


I have this requirement to put space as a substitution for some cases.

Isn't there any option to give space to a variable and use it in sed?
Because, I am using sed for replacing other strings in my script, including space is one of the requirement.

In the above code, I am trying to replace '1' with string a (some string / space ) depending on the input read.
# 4  
Old 11-07-2016
Quote:
Originally Posted by rahulsk
I have this requirement to put space as a substitution for some cases.

Isn't there any option to give space to a variable and use it in sed?
Because, I am using sed for replacing other strings in my script, including space is one of the requirement.

In the above code, I am trying to replace '1' with string a (some string / space ) depending on the input read.
Yes, there is a way to do it. Do it exactly as I showed you in post #2 in this thread.
This User Gave Thanks to Don Cragun For This Post:
# 5  
Old 11-07-2016
Quote:
Originally Posted by Don Cragun
Note that unless you quote the entire substitute command, you can't include blanks in the substitution string because the shell will see sequences of blanks in the substitute command as field separators; not as data included in the replacement string.
I'd like to respectfully disagree: you can do that, but it takes a little effort with the quoting to make sure the string doesn't undergo the shells field splitting:

Code:
a=" "
print - "yxyxyxy" | sed 's/x/'"$a"'/'
y y y y

Of course all the usual problems with shell strings used as sed program(part)s persist: metacharacters, which might lead to the regexp meaning something very different from the expected, etc..

I hope this helps.

bakunin
# 6  
Old 11-07-2016
Quote:
Originally Posted by bakunin
I'd like to respectfully disagree: you can do that, but it takes a little effort with the quoting to make sure the string doesn't undergo the shells field splitting:

Code:
a=" "
print - "yxyxyxy" | sed 's/x/'"$a"'/'
y y y y

Of course all the usual problems with shell strings used as sed program(part)s persist: metacharacters, which might lead to the regexp meaning something very different from the expected, etc..

I hope this helps.

bakunin
Hi bakunin,
You are absolutely correct in saying that the entire substitute command doesn't have to be quoted (only characters subject to field splitting, pathname expansions, and other expansions that have already been discussed have to be quoted), but note that in your example:
Code:
sed 's/x/'"$a"'/'

you have the entire substitute command quoted (some in single quotes and some in double quotes, and backslashes can also be used to quote characters in strings). But, we could have written this specific command as:
Code:
sed s/x/"$a"/

(without the single quotes) and still get the same results. But, if the substitute pattern had contained bracket expressions, asterisks, question marks, or parentheses, they would have to be quoted to protect against possible pathname expansions. I don't know of any case where someone writing a script using sed needs to write an unquoted substitute command to make it work correctly. Therefore, I generally tell noobies to always quote the entire substitute command. They just have to decide which quotes are appropriate to use to get dollar signs in the pattern and in the replacement text to work as desired.
# 7  
Old 11-07-2016
Quote:
Originally Posted by Don Cragun
Therefore, I generally tell noobies to always quote the entire substitute command.
D'accord!

I understood your first quote to mean you have to enclose everything into one quotation. Personally. i prefer to enclose to biggest-possible part of my sed-scripts always into single-quotes (to not quote them at all didn't even come to my mind, even if this might be possible for a few select scripts, as you pointed out) and only the parts where i need parameter expansion i enclose in double-quotes. This results in the way i wrote it, with the alternating single- and double-quotes.

Anyway, i take it, we used different words to mean the same.

bakunin
This User Gave Thanks to bakunin For This Post:
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

How to use a shell variable on sed command?

Hie everyone i have a complex sed command line which work fine for a static value given example sed -n '/SQL ID\:\ 1111111111111/!b;:a;/\*\*\*\*\*\*\*\*\*\*\*\*/!{$!{N;ba}};{/*/p}' ./MyInputFile.txt what i want is something like that sed -n '/SQL ID\:\... (2 Replies)
Discussion started by: ade05fr@yahoo.f
2 Replies

2. UNIX for Beginners Questions & Answers

Variable in sed command

Hi All, How can i use a variable in a sed command ? I cant seem to get it to work as at present its just printing $i at the start of every line rather than the variable $1. sed -e "s/^/\$i,|/" Any help would be appreciated. (3 Replies)
Discussion started by: mutley2202
3 Replies

3. Shell Programming and Scripting

Using a variable in sed command

Hi All, Can I use a variable (using this variable as a counter) in sed cmd? something like below sed -n '${COUNT}p' But it's not working. Pls help. Thanks. Regards, Amee export COUNT=1 export COUNTER=`cat ${BINPATH}/$ALLOC_FILE.clean_1 | wc -l | tr -d " "` while ... (3 Replies)
Discussion started by: Amee5
3 Replies

4. Shell Programming and Scripting

sed command with variable

Hi, I want to insert some text in the begning of each line. But issue is the text that i want to insert is stored into one variable. so my command look like constr="`date | awk '{print $3"-"$2"-"$6}'`",MXGBTST1" " sed 's/^/\$constr/g' alert_temp.csv but sed command instead of taking... (3 Replies)
Discussion started by: ranvijaidba
3 Replies

5. Shell Programming and Scripting

sed command to take variable

I have file File1.txt in which i have to replace a text using sed command File1.txt contents EURAMOUNTTOBEREPLACED I have a AIX shell script for replacing the text AMOUNTTOBEREPLACED Contents of the shell script sum=27 sed 's/AMOUNTTOBEREPLACED/"$sum"/g' File1.txt >> temp mv temp... (5 Replies)
Discussion started by: bk_12345
5 Replies

6. UNIX for Dummies Questions & Answers

sed insert command and variable expansion/command substitution

I know this script is crummy, but I was just messing around.. how do I get sed's insert command to allow variable expansion to show the filename? #!/bin/bash filename=`echo $0` /usr/bin/sed '/#include/ { i\ the filename is `$filename` }' $1 exit 0 (8 Replies)
Discussion started by: glev2005
8 Replies

7. Shell Programming and Scripting

Passing a variable to sed command

Hi guys, I wanted to pass a variable to the sed command which tells which line to be deleted. a=2; echo $a; sed '$ad' c.out it is throwing an error. sed: 0602-403 "$a"d is not a recognized function. I even tried "$a" and \$a.. but it is of no use. Can you please correct me... (6 Replies)
Discussion started by: mac4rfree
6 Replies

8. Shell Programming and Scripting

Insert a line including Variable & Carriage Return / sed command as Variable

I want to instert Category:XXXXX into the 2. line something like this should work, but I have somewhere the wrong sytanx. something with the linebreak goes wrong: sed "2i\\${n}Category:$cat\n" Sample: Titel Blahh Blahh abllk sdhsd sjdhf Blahh Blah Blahh Blahh Should look like... (2 Replies)
Discussion started by: lowmaster
2 Replies

9. Shell Programming and Scripting

Need a sed command that uses variable

Hi , Seen some of wonderful posts. Please have look at my problem. I have a text file ketkee.txt , which look like below. GATES := apple mango banana XMLCHECK := red blue green pink My requiement is to find the line that has XMLCHECK in it. and append two variables followed by a space... (2 Replies)
Discussion started by: ketkeep
2 Replies

10. Shell Programming and Scripting

using the sed command with variable subsitution???

how much do you know on using the sed commands within a diff command? I'm currently using one long command when robot runs that... when the diff command is ran that the < and > signs at the beginning of each line are changed to the environment name that they came from... making it easier to... (2 Replies)
Discussion started by: anthreedhr
2 Replies
Login or Register to Ask a Question