SED命令没有从bash脚本运行

时间:2013-11-22 10:49:54

标签: bash shell scripting sed

我编写了一个bash脚本,它在文件上调用sed命令(以及其他内容)来完成2个不同字符串的查找/替换。

问题是,在运行脚本之后,我检查文件并且没有更新任何内容。但是,如果我运行正在生成的命令(无论如何我将它们作为输出回显),那么它们就可以工作。

例如,在脚本中我有:

echo "/usr/local/bin/sed -i -e 's/${String1}/${String1R}/g;s/\/${String2}\//\/${String2R}\//g' ${ROOT_DIR}/data/file.sql"
/usr/local/bin/sed -i -e 's/${String1}/${String1R}/g;s/\/${String2}\//\/${TString2R}\//g' ${ROOT_DIR}/data/file.sql

运行脚本不会改变file.sql;但是,如果我运行打印到控制台的命令,例如/ usr / local / bin / sed -i -e的/ file_name1 / file_name2 / g; s // path_substring1 /// path_substring2 // g'/path/to/file/file.sql它完美无缺!

1 个答案:

答案 0 :(得分:6)

使用双引号而不是单引号。单引号会阻止变量扩展。

/usr/local/bin/sed -i -e "s/${String1}/${String1R}/g;s/\/${String2}\//\/${TString2R}\//g" ${ROOT_DIR}/data/file.sql

此外,您的变量似乎是可能包含正斜杠的路径字符串,即/。在那种情况下,使用不同的分隔符:

"s|${String1}|${String1R}|g"

使用不同的分隔符可以避免在模式和替换中转义/