【问题标题】:SED command not being run from bash script未从 bash 脚本运行 SED 命令
【发布时间】:2013-12-07 05:24:46
【问题描述】:

我编写了一个 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 's/file_name1/file_name2/g;s//path_substring1///path_substring2//g' /path/to/file/file.sql 完美运行!

【问题讨论】:

  • 我不明白“回声”的目的......
  • 您经常使用“字符串”这个词,但是您的脚本没有进行字符串比较,而是进行正则表达式比较,可以吗?如果“String1”,它会回来咬你。例如,包含.、?、*等RE元字符。

标签: bash shell scripting sed


【解决方案1】:

使用双引号代替单引号。单引号会阻止变量扩展。

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

此外,您的变量似乎是可能包含正斜杠的路径字符串,即/。在这种情况下使用不同的分隔符:

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

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

【讨论】:

  • 感谢 devnull。一件事,用 | 代替 /没用。幸运的是,路径子字符串不应该包含任何斜杠,但是,它会更干净而不必转义它们。您需要提供分隔符作为单独的参数吗?
  • @user2294382 我不知道为什么它不适合你。例如,尝试执行命令:echo a/b/c | sed "s|/b/|//d//|g" 并观察它的作用。
  • 嗯,奇怪的是,我得到了一个//d//c。我一定做错了什么。谢谢
  • @user2294382 是的,这正是预期的输出。我试图说明您不需要在模式和替换中转义 / 的事实。模式 /b/ 被替换为 //d// 而没有转义斜线。
猜你喜欢
  • 1970-01-01
  • 2015-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-15
  • 2022-06-15
  • 2016-10-20
  • 1970-01-01
相关资源
最近更新 更多