我编写了一个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它完美无缺!
答案 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"
使用不同的分隔符可以避免在模式和替换中转义/
。