SED命令没有从bash脚本运行

use*_*382 2 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
Run Code Online (Sandbox Code Playgroud)

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

dev*_*ull 6

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

/usr/local/bin/sed -i -e "s/${String1}/${String1R}/g;s/\/${String2}\//\/${TString2R}\//g" ${ROOT_DIR}/data/file.sql
Run Code Online (Sandbox Code Playgroud)

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

"s|${String1}|${String1R}|g"
Run Code Online (Sandbox Code Playgroud)

使用不同的分隔符可以避免/在模式和替换中逃逸的需要.