If I run these commands from a script:
#my.sh
PWD=bla
sed 's/xxx/'$PWD'/'
...
$ ./my.sh
xxx
bla
it is fine.
But, if I run:
#my.sh
sed 's/xxx/'$PWD'/'
...
$ ./my.sh
$ sed: -e expression #1, char 8: Unknown option to `s'
I read in tutorials that to substitute environment variables from shell you need to stop, and 'out quote' the $varname
part so that it is not substituted directly, which is what I did, and which works only if the variable is defined immediately before.
How can I get sed to recognize a $var
as an environment variable as it is defined in the shell?
bad way: change delimiter
maybe those not the final answer,
you can not known what character will occur in
$PWD
,/
:
OR@
.the good way is replace the special character in
$PWD
.good way: escape delimiter
for example:
use
/
as delimiterOR
use
:
as delimiter (more readable than/
)where VAR contains what you want to replace the field with
Dealing with VARIABLES within sed
You can use other characters besides "/" in substitution:
I had similar problem, I had a list and I have to build a SQL script based on template (that contained
@INPUT@
as element to replace):Actually, the simplest thing (in gnu sed at least) is to use a different separator for the sed substitution (s) command. So instead of s/pattern/'$mypath'/ being expanded to s/pattern//my/path/ which will of course confuse the s command, use s!pattern!'$mypath'! which will be expanded to s!pattern!/my/path! I've used the bang (!) character (or use anything you like) which avoids the usual, but-by-no-means-your-only-choice forward slash as the separator.