我试图用 替换脚本中变量的值,sed
但到目前为止的结果是更改的变量被写入stdout
,而不是脚本。
我究竟做错了什么?
这是我的脚本:
#!/bin/bash
# si es la primera vez, hacemos una copia de nuestro /etc/hosts
ls /etc/hosts.old &> /dev/null
if [ $? -ne 0 ]; then
cp /etc/hosts /etc/hosts.old
fi
# comprobamos con curl si el documento se modifico en el servidor
OLD="Nov"
NEW=`curl -sI http://winhelp2002.mvps.org/hosts.txt| grep Last-Modified|awk '{print $4}'`
if [ $OLD != $NEW ]; then
#wget http://winhelp2002.mvps.org/hosts.txt -O /root/hosts.txt
#cat /root/hosts.txt|uniq >> /etc/hosts
# actualizamos la variable OLD si cambió
sed -n "/OLD=/ cOLD=${NEW}" /root/addblock.sh
else
echo " el archivo no se modifico"
fi
exit
这是输出:
# ./addblock.sh # OLD=Dec #
答案1
您做“错误”的事情是要求 sed 更改一行,但没有将该输出捕获回您想要的文件中。默认情况下,sed 打印到标准输出。
正如评论所说,您可以使用 (GNU) sed 的-i
选项来“就地”编辑,或使用重定向:
sed -i -n "/OLD=/ cOLD=${NEW}" /root/addblock.sh
或者
cp -p /root/addblock.sh.prev && \
sed -n "/OLD=/ cOLD=${NEW}" /root/addblock.sh.prev > /root/addblock.sh
答案2
将文件保存/root/addblock.sh
在某处。并替换指令:
sed -n "/OLD=/ cOLD=${NEW}" /root/addblock.sh
通过这个指令:
sed -i.bak "s/OLD=/cOLD=${NEW}/" /root/addblock.sh
说明
该选项-i
用于直接对文件进行更改,将.bak
用于保存原始内容。/root/addblock.sh
/root/addblock.sh.bak
中的 ss/OLD=/cOLD=${NEW}/
是sed
用于替换的命令,没有它,sed
将像 一样工作grep
。