转义sed表达式中的变量中的字符

时间:2013-06-24 10:12:17

标签: bash sed

所以我有一个问题,我的脚本的这部分不起作用。我不确定到底发生了什么,但我感觉到它是因为我没有逃过变量中的某些字符。我尝试了以下但没有运气:

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

看到以某种方式抛出的所有额外垃圾?

1 个答案:

答案 0 :(得分:7)

是的,问题可能是$CTMP包含星号,由sed解释为量词。 .也是一个特殊角色。尝试逃避它们:

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

然后使用CTMP_ESC代替CTMP

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

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

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 -