说明

说明

我试图用 替换脚本中变量的值,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

相关内容