설명하다

설명하다

스크립트의 변수 값을 로 바꾸려고 하는데 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는 표준 출력으로 인쇄합니다.

의견에서 알 수 있듯이 -i(GNU) sed 옵션을 사용하여 "제자리"를 편집하거나 리디렉션을 사용할 수 있습니다.

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

s in은  대체 명령 s/OLD=/cOLD=${NEW}/이며 , 이것이 없으면 동일하게 작동합니다 .sedsedgrep

관련 정보