我似乎不能在sed命令使用一个变量,例如:
sed "24s/.*/"$ct_tname"/" file1.sas > file2.sas
我想$ct_tname
的变量,而不是从字面上$ct_tname
,这就是我不断收到。
任何人都知道如何得到这个工作?
这个问题实际上是更加复杂和我省略了一些信息。
ct_fname="%let outputfile="/user/ct_"$1".csv";"
在这里, $1
是在我的bash脚本开始传入的参数(SED被bash脚本内运行)。
这不正常运行,但是它确实运行,如果我取代ct_fname
与
ct_fname="%let table=ct_$1;"
有没有办法让第一ct_fname
要顺利通过?
你需要用双引号( "
),而不是单引号( '
)。单引号字面上通过他们的内容,而无需翻译变量(扩大)。
尝试
sed "24s/.*/\"$ct_tname\"/" file1.sas > file2.sas
顺便说一句,如果你要来编辑文件(即如果file2.sas是一个临时文件),你应该使用ed
代替。
就我而言,我只是remplaced由双那些单引号:
for a in $(cat ext.cnf); do sed -n "/$a$/p" file1 >> file2; done
现在,它的工作好...
您需要使用双( "
)报价单( '
)引用变量的值不被替换既然你有你的替换文本双引号,需要转义:
sed "24s/.*/\"$ct_tname\"/" file1.sas > file2.sas
壳牌变量不是单引号内扩展。 试试这个:
sed "24s/.*/\"$ct_tname\"/" file1.sas > file2.sas
其他答案专注于他们的榜样使用转义双引号的。 请注意,这并不总是你想要什么:
$ 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
问题是,当$ct_fname
被取代, sed
看到额外的/
分离器,所以
sed "24s/.*/"$ct_tname"/" file1.sas > file2.sas
变
sed "24s/.*/"%let outputfile=/user/ct_ARGUMENT1.csv;"/" file1.sas > file2.sas
你会得到一个sed
,因为有5个错误/
而不是预期的3。
取而代之的是,改变你sed
分隔像一个未使用的字符|
或:
和单一或双引号将工作得很好:
sed '24s|.*|'$ct_tname'|' file1.sas > file2.sas
sed "24s|.*|"$ct_tname"|" file1.sas > file2.sas