Sed가 "."을(를) 탈출합니다. $변수를 사용하나요?

Sed가 "."을(를) 탈출합니다. $변수를 사용하나요?

탈출하는 게 이해가 안 돼요. 일부 발전기를 사용할 수 있습니까?

일반 텍스트(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확장 정규식을 활성화해야 하기 때문에 여기에서 사용하고 있습니다 ( |기본값인 기본 정규식 구문의 일부가 아닙니다).

관련 정보