Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
未从bash脚本运行SED命令_Bash_Shell_Scripting_Sed - Fatal编程技术网

未从bash脚本运行SED命令

未从bash脚本运行SED命令,bash,shell,scripting,sed,Bash,Shell,Scripting,Sed,我编写了一个bash脚本,它在一个文件上调用一个sed命令(除其他外),以完成两个不同字符串的查找/替换 问题是,在运行脚本后,我检查了文件,但没有更新任何内容。但是,如果我运行正在生成的命令(无论如何,我将它们作为输出进行回显),那么它们就可以工作 例如,在脚本中,我有: echo "/usr/local/bin/sed -i -e 's/${String1}/${String1R}/g;s/\/${String2}\//\/${String2R}\//g' ${ROOT_DIR}/data/

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

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

例如,在脚本中,我有:

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\u name1/file\u name2/g;s//path\u substring1///path\u 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
此外,您的变量似乎是可能包含正斜杠的路径字符串,即
/
。在这种情况下,请使用不同的分隔符:

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

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

我不明白“echo”的目的…您经常使用“string”一词,但您的脚本没有进行字符串比较,而是进行regexp比较,可以吗?如果“String1”,它会回来咬你。例如,包含RE元字符,如
*
等。谢谢devnull。有一件事,用|代替不起作用。幸运的是,路径子字符串不应该包含任何斜杠,但是,它会更干净,而不必逃避斜杠。是否需要将分隔符作为单独的参数提供?@user2294382我不确定它为什么对您不起作用。例如,尝试执行以下命令:
echo a/b/c | sed“s |/b/|/d/|g”
,并观察它的作用。嗯,奇怪的是,它起作用了-我得到了一个//d//c。我一定做错了什么。Thanks@user2294382是的,这正是预期的产出。我试图说明一个事实,即您不需要在模式和替换中逃避
/
。模式
/b/
被替换为
/d/
,但没有转义斜杠。