28

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

4

6 回答 6

42

您需要使用双引号 ( ") 而不是单引号 ( ')。单引号按字面意思传递它们的内容,而不翻译变量(扩展)。

尝试

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

顺便说一句,如果你要编辑一个文件(也就是说,如果file2.sas是一个临时文件),你应该使用它ed

于 2012-06-21T20:24:10.040 回答
5

就我而言,我只是用双引号替换了单引号:

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

目前,它运行良好...

于 2014-07-17T10:51:57.503 回答
3

问题是当$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分隔符更改为未使用的字符,例如|or :,单引​​号或双引号都可以正常工作:

sed '24s|.*|'$ct_tname'|' file1.sas > file2.sas
sed "24s|.*|"$ct_tname"|" file1.sas > file2.sas
于 2018-02-12T15:09:09.433 回答
2

Shell 变量不在单引号内展开。试试这个:

sed "24s/.*/\"$ct_tname\"/" file1.sas > file2.sas
于 2012-06-21T20:25:51.787 回答
1

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

sed "24s/.*/\"$ct_tname\"/" file1.sas > file2.sas
于 2012-06-21T20:25:23.640 回答
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
于 2014-02-11T11:15:50.807 回答