Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 在sed命令中使用变量_Bash_Variables_Sed_Escaping - Fatal编程技术网

Bash 在sed命令中使用变量

Bash 在sed命令中使用变量,bash,variables,sed,escaping,Bash,Variables,Sed,Escaping,我似乎不能在sed命令中使用变量,例如: sed "24s/.*/"$ct_tname"/" file1.sas > file2.sas 我想要$ct\u tname变量,而不是我一直得到的$ct\u tname 有人知道如何让它工作吗 这个问题实际上更复杂,我省略了一些信息 ct_fname="%let outputfile="/user/ct_"$1".csv";" 这里,$1是在bash脚本开始时传入的参数(sed在bash脚本中运行) 这不会成功运行,但如果我将ct\u fna

我似乎不能在sed命令中使用变量,例如:

sed "24s/.*/"$ct_tname"/" file1.sas > file2.sas
我想要
$ct\u tname
变量,而不是我一直得到的
$ct\u tname

有人知道如何让它工作吗

这个问题实际上更复杂,我省略了一些信息

ct_fname="%let outputfile="/user/ct_"$1".csv";"
这里,
$1
是在bash脚本开始时传入的参数(sed在bash脚本中运行)

这不会成功运行,但如果我将
ct\u fname
替换为

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

有没有办法让第一个
ct\u fname
成功传递?

您需要使用双引号(
)而不是单引号(
)。 单引号逐字传递其内容,而不转换变量(扩展)

试一试

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

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

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

Shell变量不在单引号内展开。请尝试以下方法:

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

在我的例子中,我只是将单引号替换为双引号:

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

现在,它工作得很好…

问题是当替换
$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

它在S.O.上出现过很多次,因此应该禁止再次回答:P我认为S.O.应该阻止发布一个问题,如果它发现一个类似的主题,那么,不是阻止,而是在发布之前警告已经回答了一个类似的问题,并让用户在继续发布他们的问题之前先检查一下。实际上,我的问题有点复杂,不能通过简单地将“改为”来解决,上面编辑的问题。我认为我面临的问题相当具有挑战性,而不是关于这个问题的常见问题。Brilliant的可能重复!这在我的输入字符串满是/时帮助了我。谢谢!
sed '24s|.*|'$ct_tname'|' file1.sas > file2.sas
sed "24s|.*|"$ct_tname"|" file1.sas > file2.sas