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它完美无缺!
使用双引号而不是单引号.单引号会阻止变量扩展.
/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)
使用不同的分隔符可以避免/在模式和替换中逃逸的需要.