在sed命令中使用变量

时间:2012-06-21 20:20:01

标签: bash variables sed escaping

我似乎无法在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成功通过?

6 个答案:

答案 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