sed "."를 탈출하고 $variable을 사용하시겠습니까?

sed "."를 탈출하고 $variable을 사용하시겠습니까?

나는 이런 회피를 이해하지 못한다. 발전기가 있나요?

일반 텍스트(185...)를 $NEW_DNS 변수로 바꿔야 합니다.

sed -i "185.228.168.168,185.228.169.168|$NEW_DNS /etc/wireguard/wg0.conf

산출

sed: -e expression #1, char 4: unknown command: `.'

업데이트: 답변을 확인하고 작동하길 바랍니다. /etc/wireguard/wg0.conf가 새 데이터로 다시 작성되지 않았다는 것입니다(그러나 출력은 정확합니다.

# client start menu
echo "What can i do for you today? "
options=("Show Clients" "Show your DNS Server" "Change your DNS Server" "Install/add new Client" "Quit")
select opt in "${options[@]}"
do
    case $opt in
        "Show Clients")
            ls *.conf
            ;;
            "Show your DNS Server")
            if [ $( head -n1 $CONF | awk '{print $5}') == "1.1.1.1,1.0.0.1" ]; then
                echo "Your Public DNS Server is Cloudflare (1.1.1.1,1.0.0.1), great unfiltered choice for best speed worldwide! "
            fi
               if [ $( head -n1 $CONF | awk '{print $5}') == "176.103.130.130,176.103.130.131" ]; then
                echo "Your Public DNS Server is Adguard (176.103.130.130,176.103.130.131), Advertising Filter kill them all! "
            fi
               if [ $( head -n1 $CONF | awk '{print $5}') == "84.200.69.80,84.200.70.40" ]; then
                echo "Your Public DNS Server is WATCH.DNS (84.200.69.80,84.200.70.40), great unfiltered choice for German Clients! "
            fi
               if [ $( head -n1 $CONF | awk '{print $5}') == "9.9.9.9, 149.112.112.112" ]; then
                echo "Your Public DNS Server is QUAD9 (9.9.9.9, 149.112.112.112), great TLS encrypted unfiltered choice! "
            fi
               if [ $( head -n1 $CONF | awk '{print $5}') == "77.88.8.7,77.88.8.3" ]; then
                echo "Your Public DNS Server is Yandex (77.88.8.7,77.88.8.3), safe choice with Family Filter! "
            fi
               if [ $( head -n1 $CONF | awk '{print $5}') == "185.228.168.168,185.228.169.168" ]; then
                echo "Your Public DNS Server is Clean Browsing (185.228.168.168,185.228.169.168), Uuh TLS encrypted safe choice with Family Filter and Youtube-Safe Option! "
                fi
               if [ $( head -n1 $CONF | awk '{print $5}') == "10.8.0.1" ]; then
                echo "Nothing else then own encrypted and logless dedicated DNS Server! "
                 fi
                 ;;
            "Change your DNS Server")
             if [ $( head -n1 $CONF | awk '{print $5}') == "1.1.1.1,1.0.0.1" ]; then
                 echo "Your Public DNS Server is Cloudflare (1.1.1.1,1.0.0.1), great unfiltered choice for best speed worldwide! "
             fi
               if [ $( head -n1 $CONF | awk '{print $5}') == "176.103.130.130,176.103.130.131" ]; then
                 echo "Your Public DNS Server is Adguard (176.103.130.130,176.103.130.131), Advertising Filter kill them all! "
             fi
               if [ $( head -n1 $CONF | awk '{print $5}') == "84.200.69.80,84.200.70.40" ]; then
                 echo "Your Public DNS Server is WATCH.DNS (84.200.69.80,84.200.70.40), great unfiltered choice for German Clients! "
             fi
               if [ $( head -n1 $CONF | awk '{print $5}') == "9.9.9.9, 149.112.112.112" ]; then
                 echo "Your Public DNS Server is QUAD9 (9.9.9.9, 149.112.112.112), great TLS encrypted unfiltered choice! "
             fi
               if [ $( head -n1 $CONF | awk '{print $5}') == "77.88.8.7,77.88.8.3" ]; then
                 echo "Your Public DNS Server is Yandex (77.88.8.7,77.88.8.3), safe choice with Family Filter! "
             fi
               if [ $( head -n1 $CONF | awk '{print $5}') == "185.228.168.168,185.228.169.168" ]; then
                      echo "Your want leave your Clean Browsing server and use another one?. You need generate new configs later, if you want to use new Server (Start Menu choice: 3 ) "
                      # client choice NEW DNS
                          read -rp "Do you really want to change your DNS Server? (y/n) " -e -i y NEW_DNS
                            if [ "$NEW_DNS" == "y" ]; then
                              echo "Which DNS do you want to use with the VPN?"
                                echo "You recognise encrypted DNS with "TLS" (Port 853 can be potentially blocked through Government etc.) Some Servers use logs, but no one of them log aWireguard IP. "
                              echo "   1) Cloudflare: log: yes 24h, Filter: no, + best speed worldwide"
                              echo "   2) AdGuard: Log: yes, Filter: advertising"
                              echo "   3) DNS.WATCH: Log: no, Filter: no, + great speed for Germany"
                              echo "   4) Quad9: TLS: yes, Log: yes, Filter: no"
                              echo "   5) Yandex Family: TLS:no, Log: yes, Filter: adult"
                              echo "   6) Clean Browsing Family: TLS: yes, Log: yes, Filter: adult and explicit sites, Youtube- safe mode"
                              read -p "DNS [1-6]: " -e -i 1 NEW_DNS

                              case $NEW_DNS in
                                  1)
                                      NEW_DNS="1.1.1.1,1.0.0.1"
                                  ;;
                                  2)
                                  NEW_DNS="176.103.130.130,176.103.130.131"
                                  ;;
                                  3)
                                  NEW_DNS="84.200.69.80,84.200.70.40"
                                  ;;
                                  4)
                                  NEW_DNS="9.9.9.9, 149.112.112.112"
                                  ;;
                                  5)
                                  NEW_DNS="77.88.8.7,77.88.8.3"
                                  ;;
                                  6)
                                  NEW_DNS="185.228.168.168,185.228.169.168"
                                  ;;
                              esac
                            fi
                      # EOF client choices DNS
                fi
                sed "s/185\.228\.168\.168,185\.228\.169\.168/$NEW_DNS/" /etc/wireguard/wg0.conf
               if [ $( head -n1 $CONF | awk '{print $5}') == "10.8.0.1" ]; then
                 echo "Nothing else then own encrypted and logless dedicated DNS Server! "
                 fi
                 ;;
        "Install/add new Client")
            break
            ;;
        "Quit")
              exit
            ;;
    esac
done

답변1

문자열 자체를 변수의 내용으로 바꾸려면 다음을 수행하십시오.

sed "s|185\.228\.168\.168,185\.228\.169\.168|$NEW_DNS|" /etc/wireguard/wg0.conf

당신은해야합니다 sed s|string|replacement|. sed s|string|replacement|g파일 전체에서 이를 사용하여 교체 할 수 있습니다 . 또한 .단일 문자를 나타내지 않도록 백슬래시를 사용하여 이스케이프 처리 해야 합니다 . -i변경 사항이 표준 출력에 기록되어 원하는 내용인지 확인할 수 있도록 스위치를 제거했습니다 . 올바른지 확인한 후에는 명령에 다시 넣을 수 있습니다.

파일 자체를 편집하려면 -i명령에 스위치를 추가하십시오.

sed -i "s|185\.228\.168\.168,185\.228\.169\.168|$NEW_DNS|" /etc/wireguard/wg0.conf

답변2

sin 명령은 sed주어진 정규식과 일치하는 모든 항목을 주어진 대체 텍스트로 바꿉니다. 구문은 입니다 s/expression/text/flags.

귀하의 경우에는 다음 표현을 사용하고 싶습니다.

185\.228\.168\.168,185\.228\.169\.168

정규식에서 "특별"하기 때문에 점을 이스케이프 처리했습니다(이스케이프 처리되지 않은 점은 단일 문자와 일치하지만 실제 점과 일치하려고 함).

대체 텍스트로 사용할 텍스트는 변수에 있습니다. 이는 전체 sed표현식이 큰따옴표로 묶인 문자열이어야 함을 의미합니다(셸은 작은따옴표로 묶인 문자열 내의 변수를 무시하기 때문입니다).

s또한 여기에서는 명령에 대한 선택적 플래그가 필요하지 않으므로 다음을 얻습니다.

sed "s/185\.228\.168\.168,185\.228\.169\.168/$NEW_DNS/" filename

직접 눈으로 올바른 결과를 확인할 때까지 그 sed -i자리에서 편집 하지 마세요.

또한 변수 값을 스크립트에 주입하므로 sed문자가 포함되어 있으면 실패할 것입니다(이 특별한 경우에는 발생하지 않을 것 같습니다).$NEW_DNS/

"이 주소 또는 저 주소"를 의미하기 위해 쉼표를 사용하는 경우 대체 문자( )를 사용해야 합니다 |.

sed -E "s/185\.228\.168\.168|185\.228\.169\.168/$NEW_DNS/" filename

sed -E여기서는 확장 정규식( |기본 기본 정규식 구문의 일부가 아님) 을 활성화해야 하기 때문에 이를 사용합니다 .

관련 정보