简体   繁体   中英

Use a variable in a sed command

I can't seem to use a variable in a sed command, for example:

sed "24s/.*/"$ct_tname"/" file1.sas > file2.sas

I want $ct_tname the variable, not literally $ct_tname , which is what I keep getting.

Anybody know how to get this to work?

The problem is actually more complex and I omitted some information.

ct_fname="%let outputfile="/user/ct_"$1".csv";"

Here, $1 is the argument passed in at the start of my bash script (sed is being run inside a bash script).

This doesn't run successfully, but it does run if I replace ct_fname with

ct_fname="%let table=ct_$1;"

Is there a way to get the first ct_fname to be passed successfully?

you need to use double quotes ( " ) instead of single quotes ( ' ). single quotes pass their content literally, without translating variables (expansion).

try

sed "24s/.*/\"$ct_tname\"/" file1.sas > file2.sas

btw, if you're going to be editing a file (that is if file2.sas is a temporary file), you should be using ed instead.

In my case, i just remplaced single quotes by the double ones:

for a in $(cat ext.cnf); do sed -n "/$a$/p" file1 >> file2; done

For now, it's working well...

你需要使用双( " )引号,单引号( ' )引号变量的值不会被替换。由于你的替换文本中有双引号,你需要转义它们:

sed "24s/.*/\"$ct_tname\"/" file1.sas > file2.sas

Shell variables are not expanded inside single quotes. Try this instead:

sed "24s/.*/\"$ct_tname\"/" file1.sas > file2.sas

Other answers focus on the use of escaped double quotes in their examples. Note that this is not always what you want :

$ FOO="auie"; echo foo123bar|sed "s/123/\"$FOO\"/"
foo"auie"bar
$ FOO="auie"; echo foo123bar|sed "s/123/$FOO/"
fooauiebar
$ FOO="auie"; echo fooauiebar|sed "s/\"$FOO\"/123/"
fooauiebar
$ FOO="auie"; echo fooauiebar|sed "s/$FOO/123/"
foo123bar

The problem is that when $ct_fname is substituted, sed sees extra / separators, so

sed "24s/.*/"$ct_tname"/" file1.sas > file2.sas

becomes

sed "24s/.*/"%let outputfile=/user/ct_ARGUMENT1.csv;"/" file1.sas > file2.sas

and you'll get a sed error because there are 5 / instead of the expected 3.

Instead, change your sed separators to an unused character like | or : , and either single or double quotes will work just fine:

sed '24s|.*|'$ct_tname'|' file1.sas > file2.sas
sed "24s|.*|"$ct_tname"|" file1.sas > file2.sas

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM