sed,引号中的正斜杠

时间:2012-06-21 21:53:09

标签: bash sed escaping quotes

我正试图在bash中使用sed做一些证明非常困难的事情。

我有一个bash脚本,它的第一个参数是日期。

代码想要更改文本文件中的一行以包含传递的日期。这是代码

#!/bin/bash

cq_fname="%let outputfile="/user/cq_"$1".csv";"

sed "29s/.*/\"$ct_fname\"/" file1.sas > file2.sas

这个脚本在第三行失败,我得到一些关于乱码的命令。有没有人知道一个聪明的方法让它工作?如何在sed中的引号中使用正斜杠?

4 个答案:

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