Sed maskiert "." und verwendet $variable?

Sed maskiert "." und verwendet $variable?

Ich verstehe dieses Entkommen nicht. Gibt es dafür einen Generator?

ich muss normalen Text (185...) durch die Variable $NEW_DNS ersetzen

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

Ausgabe

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

Update: Ich habe, wie Sie sehen können, Antworten und es funktioniert, nur wird /etc/wireguard/wg0.conf nicht mit neuen Daten neu geschrieben (aber die Ausgabe ist korrekt).

# 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

Antwort1

Wenn Sie diese Zeichenfolge selbst durch das ersetzen möchten, was Sie in der Variablen haben:

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

Sie benötigen sed s|string|replacement|. Sie können sed s|string|replacement|ges in der gesamten Datei ersetzen. Sie müssen auch .mit einem Backslash aussteigen, damit es nicht ein einzelnes Zeichen darstellt. Ich habe den -iSchalter entfernt, damit die Änderungen in die Standardausgabe geschrieben werden, damit Sie sicherstellen können, dass es das ist, was Sie wollen. Sie können es wieder in den Befehl einfügen, sobald Sie bestätigt haben, dass es so ist.

Wenn Sie die Datei selbst bearbeiten möchten, fügen Sie den -iSchalter zu Ihrem Befehl hinzu.

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

Antwort2

Der sBefehl in sedersetzt alles, was dem angegebenen regulären Ausdruck entspricht, durch den angegebenen Ersatztext. Die Syntax lautet s/expression/text/flags.

In Ihrem Fall möchten Sie den Ausdruck verwenden

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

Ich habe die Punkte maskiert, da diese in regulären Ausdrücken „speziell“ sind (ein nicht maskierter Punkt entspricht jedem einzelnen Zeichen, Sie möchten aber die tatsächlichen Punkte abgleichen).

Der Text, den Sie als Ersatztext verwenden möchten, befindet sich in einer Variablen. Dies bedeutet, dass der gesamte sedAusdruck ein String in doppelten Anführungszeichen sein muss (da die Shell die Variable in einem String in einfachen Anführungszeichen ignorieren würde).

Außerdem benötigen Sie die optionalen Flags für den Befehl hier nicht s, also erhalten wir

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

Führen Sie keine sed -idirekten Bearbeitungen durch, bis Sie selbst feststellen können, dass das richtige Ergebnis erzielt wurde.

sedBeachten Sie auch, dass dies fehlschlagen würde, wenn der Wert Ihrer Variable in das Skript eingefügt würde , da es Zeichen $NEW_DNSenthalten /würde (was in diesem speziellen Fall meiner Meinung nach unwahrscheinlich ist).

Wenn Sie mit dem Komma "entweder diese oder jene Adresse" meinen, müssen Sie eine Alternation (mit |) verwenden:

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

Ich verwende es sed -Ehier, da wir erweiterte reguläre Ausdrücke aktivieren müssen (das |ist nicht Teil der grundlegenden regulären Ausdruckssyntax, die die Standardeinstellung ist).

verwandte Informationen