我似乎无法在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
成功通过?
答案 0 :(得分:38)
您需要使用双引号("
)而不是单引号('
)。
单引号按字面顺序传递其内容,而不转换变量(扩展)。
尝试
sed "24s/.*/\"$ct_tname\"/" file1.sas > file2.sas
不过,如果您要编辑文件(即 file2.sas 是临时文件),您应该使用ed
。
答案 1 :(得分:4)
在我的情况下,我只用双重引号替换单引号:
for a in $(cat ext.cnf); do sed -n "/$a$/p" file1 >> file2; done
目前,它运作良好......
答案 2 :(得分:1)
您需要使用双引号("
),单引号('
)引号变量的值不会被替换。由于替换文本中有双引号,因此需要将它们转义:
sed "24s/.*/\"$ct_tname\"/" file1.sas > file2.sas
答案 3 :(得分:1)
Shell变量不会在单引号内展开。试试这个:
sed "24s/.*/\"$ct_tname\"/" file1.sas > file2.sas
答案 4 :(得分:1)
其他答案主要关注在他们的示例中使用转义双引号。请注意,这并不总是您想要的:
$ 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
答案 5 :(得分:1)
问题在于,当$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