2013-11-22 89 views
1

我已经写了一个bash脚本,它在一个文件上调用一个sed命令(其中包括)来完成一个查找/替换2个不同的字符串。SED命令不能从bash脚本运行

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

例如,在脚本中我有:

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's/file_name1/file_name2/g; s // path_substring1 /// path_substring2 // g'/path/to/file/file.sql它完美的工作!

+1

我没有得到“回声”的目的...... – opalenzuela

+0

只是为了调试 – user2294382

+0

你使用“string”这个词很多,但你的脚本没有做字符串比较,它是做正则表达式比较,是好?它会回来咬你,如果“String1”。例如,包含RE元字符,如'.','?','*'等。 –

回答

5

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

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

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

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

使用不同的分隔将避免逃避的模式和替代/的需要。

+0

谢谢devnull。有一件事,用/替换/没有工作。幸运的是,路径子字符串不应该包含任何斜线,但它将更清洁,无需转义它们。你是否需要提供分隔符作为单独的参数? – user2294382

+0

@ user2294382我不知道为什么它不适合你。例如,尝试执行命令:'echo a/b/c | sed“s |/b/| // d // | g”'并观察它的作用。 – devnull

+0

嗯奇怪的工作 - 我得到一个///// C。我一定做错了什么。谢谢 – user2294382