2

我正在尝试做一些事情bashsed这被证明是非常困难的。

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

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

#!/bin/bash

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

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

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

4

4 回答 4

6

您可以使用任何字符代替/,因此只需选择一个不在 中的字符$ct_fname

sed "29s|.*|\"$ct_fname\"|" file1.sas > file2.sas
于 2012-06-21T21:58:51.877 回答
2

此处突出显示的语法应该是您的问题所在的一个很好的指标——您已经将几个字符串与不在字符串中的内容粉碎在一起。尝试替换这个:

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

有了这个:

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

我用字符转义了"字符串内部,\并删除了"感觉文件名中可能不存在的字符。

Alok 建议对替换命令使用不同的字符——这是必要的。

此外,您需要在赋值字符串中使用相同的变量名。(哦!)

最后的脚本是:

#!/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是一个极好的小调试工具,当你需要它的时候。

于 2012-06-21T21:57:33.563 回答
0

在每组其他引号中,使用 '(单引号)而不是 "(双引号)。

于 2012-06-21T21:56:53.823 回答
0

这可能对您有用:

cq_fname='%let outputfile="/user/cq_.csv";'
sed '29c\'"$cq_fname" file1.sas > file2.sas
于 2012-06-22T05:24:18.050 回答