user2650277
user2650277

Reputation: 6739

Using variable with sed

First of all i apologise in case this has been answered before but i couldn't solve my problem.

I need to search a pattern and then replace it with a line of text comprising of both text and variable.Btw i am using bash..

say

$var = "stacko.ver/rulz=" **Note: $var contain double quotes & = & a dot and /**

i want to so the follow 1.Search for ;te.xt = Note: The value to be search contain ; & = and a dot

2.Replace it with

textnum=$var

Of course $var should be replaced with its actual value

My attempts

sed -i "s/;te.xt =/textnum=$var/" file
sed -i "s/;te.xt =/textnum="$var"/" file
sed -i "s/";te.xt ="/"textnum=$var"/" file

None of these actually worked , either sed giving me an error or the value of $var not shown in file

Thanks for the help

Regards

Upvotes: 3

Views: 216

Answers (2)

glenn jackman
glenn jackman

Reputation: 246807

I can see the error:

$ var="stacko.ver/rulz="
$ data="foo ;te.xt = bar"
$ sed "s/;te.xt =/textnum=$var/" <<< "$data"
sed: -e expression #1, char 31: unknown option to `s'

The problem is that $var contains a slash, so sed's s/// command is breaking. You need to pick a character that does not appear in $var

$ sed "s#;te.xt =#textnum=$var#" <<< "$data"
foo textnum=stacko.ver/rulz= bar

This can be hard -- what if slash and hash are in $var? Using bash, you can use ANSI-C quoting to use a control character that is unlikely to appear in your data, e.g.

$ sed $'s\037;te.xt =\037textnum=$var\037' <<< "$data"
foo textnum=stacko.ver/rulz= bar

Upvotes: 3

that other guy
that other guy

Reputation: 123470

Quoting doesn't help since this is a sed issue, not a bash issue. Just pick a sed s-expression delimiter that doesn't appear in your text:

sed -i "s|;te.xt =|textnum=$var|" file

You can pick any delimiter for s that doesn't appear in your input. sed -e 'streetlight' is a perfectly valid sed command.

Upvotes: 5

Related Questions