Bash 在sed命令中使用变量
我似乎不能在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 "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