【问题标题】:Escaping characters in variables inside sed expression在 sed 表达式中的变量中转义字符
【发布时间】:2013-06-24 19:05:39
【问题描述】:

所以我遇到了我的脚本的这一部分不起作用的问题。我不确定到底发生了什么,但我感觉它是因为我没有转义变量中的某些字符。我尝试了以下方法,但没有成功:

crontab -l | sed "s%$CTMP%\*\/$FREQ \* \* \* \* cd $DIR && \.\/$SCRIPT%" | crontab -

以下是每个变量的内容:

CTMP 变量只是 crontab 文件中的一行

CTMP='*/5 * * * * cd /home/admin/whatever && ./test.sh'

FREQ 变量是 cron 文件的时间(以分钟为单位)设置

FREQ=5

DIR 变量是当前工作目录

DIR='/home/admin/whatever'

SCRIPT 变量就是脚本文件名

SCRIPT='test.sh'

我觉得问题在于 sed 语句没有更新 crontab 文件,因为它没有转义上面这些变量中所需的字符。

这是正确的还是其他错误?

* 更新 *

CTMPESC=$(sed 's/[\*\.]/\\&/g' <<<"$CTMP")
DIRESC=$(sed 's/[\*\.]/\\&/g' <<<"$DIR")
SCRIPTESC=$(sed 's/[\*\.]/\\&/g' <<<"$SCRIPT")
crontab -l | sed "s%$CTMPESC%\*/$FREQ \* \* \* \* cd $DIRESC && \./$SCRIPTESC%" | crontab -

* 更新 *

这是 crontab 输出

*/10 * * * * cd /home/administrator/anm-1.5.0 */7 * * * * cd /home/administrator/anm-1.5.0 && ./anm.sh*/7 * * * * cd /home/administrator/anm-1.5.0 && ./anm.sh ./anm.sh

我还回应了三个转义变量只是为了排除故障,它们是:

\*/7 \* \* \* \* cd /home/administrator/anm-1\.5\.0 && \./anm\.sh
/home/administrator/anm-1\.5\.0
anm\.sh

三个转义变量实际上看起来不错。

* 更新 *

替换前的 Cron 文件:

*/10 * * * * cd /home/administrator/anm-1.5.0 && ./anm.sh

替换后的cron文件:

*/7 * * * * cd /home/administrator/anm-1.5.0 */10 * * * * cd /home/administrator/anm-1.5.0 && ./anm.sh*/10 * * * * cd /home/administrator/anm-1.5.0 && ./anm.sh ./anm.sh

看到所有以某种方式被扔到那里的额外垃圾吗?

【问题讨论】:

标签: bash sed


【解决方案1】:

是的,问题很可能是$CTMP 包含星号,sed 将其解释为量词。 . 也是一个特殊字符。尝试逃脱它们:

CTMP_ESC=$(sed 's/[\*\.]/\\&/g' <<<"$CTMP")

然后使用CTMP_ESC 而不是CTMP

此外,您无需在 sed 命令中转义 /,因为您没有将其用作 s/// 分隔符。

编辑:您还需要在替换中转义&amp;,因为sed&amp; 解释为“匹配的字符串”。所以你的脚本应该是:

CTMPESC=$(sed 's/[\*\.&]/\\&/g' <<<"$CTMP")
DIRESC=$(sed 's/[\*\.&]/\\&/g' <<<"$DIR")
SCRIPTESC=$(sed 's/[\*\.&]/\\&/g' <<<"$SCRIPT")
crontab -l | sed "s%$CTMPESC%\*/$FREQ \* \* \* \* cd $DIRESC \&\& \./$SCRIPTESC%" | crontab -

【讨论】:

  • 几乎成功了!它终于更新了,但它也在 cron 文件中添加了一些重复的东西,但至少这意味着我们非常接近。请参阅上面的代码。
  • @user2272450 重复的东西是什么意思?没有看到 crontab 很难说。替换是否不止一次发生?匹配的行是什么?
  • @user2272450 crontab 的初始内容是什么?
  • 不同的测试有些数字可能不同。替换前:*/10 * * * * cd /home/administrator/anm-1.5.0 && ./anm.sh 替换后:*/7 * * * * cd /home/administrator/anm-1.5.0 */ 10 * * * * cd /home/administrator/anm-1.5.0 && ./anm.sh*/10 * * * * cd /home/administrator/anm-1.5.0 && ./anm.sh ./anm. sh 在这种情况下唯一应该改变的是 10 应该变成 7
  • @user2272450 我现在明白了!稍后会更新答案
猜你喜欢
  • 2010-11-07
  • 2016-06-01
  • 2018-04-02
  • 1970-01-01
  • 2021-02-28
  • 1970-01-01
  • 2012-03-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多