我正试图在bash
中使用sed
做一些证明非常困难的事情。
我有一个bash
脚本,它的第一个参数是日期。
代码想要更改文本文件中的一行以包含传递的日期。这是代码
#!/bin/bash
cq_fname="%let outputfile="/user/cq_"$1".csv";"
sed "29s/.*/\"$ct_fname\"/" file1.sas > file2.sas
这个脚本在第三行失败,我得到一些关于乱码的命令。有没有人知道一个聪明的方法让它工作?如何在sed
中的引号中使用正斜杠?
答案 0 :(得分:6)
您可以使用任何字符代替/
,因此只需选择一个不在$ct_fname
中的字符:
sed "29s|.*|\"$ct_fname\"|" file1.sas > file2.sas
答案 1 :(得分:2)
这里突出显示的语法应该是一个很好的指示你的问题是什么 - 你有几个字符串与不在字符串中的内容一起被粉碎。尝试替换它:
cq_fname="%let outputfile="/user/cq_"$1".csv";"
用这个:
cq_fname="%let outputfile=\"/user/cq_$1.csv\";"
我使用"
字符转义了字符串中的\
,删除了"
字符,这些字符可能在文件名中不存在。
Alok suggests using a different character for the replacement command - 这是必要的。
此外,您需要在分配和字符串中使用相同的变量名称。 (D'哦!)
最终的剧本是:
#!/bin/bash
cq_fname="%let outputfile=\"/user/cq_$1.csv\";"
sed "29s|.*|$cq_fname|" file1.sas > file2.sas
我通过在脚本顶部添加set -x
找到了不匹配的变量名称;它显示了脚本的执行输出。
断裂:
$ ./replace
+ cq_fname='%let outputfile="/user/cq_.csv";'
+ sed '29s|.*||' file1.sas
修正:
$ ./replace
+ cq_fname='%let outputfile="/user/cq_.csv";'
+ sed '29s|.*|%let outputfile="/user/cq_.csv";|' file1.sas
set -x
是一个极好的小调试工具,当你需要它时。
答案 2 :(得分:0)
在每组其他报价单上,使用'(单引号)代替“(双引号)。
答案 3 :(得分:0)
这可能对您有用:
cq_fname='%let outputfile="/user/cq_.csv";'
sed '29c\'"$cq_fname" file1.sas > file2.sas