Entkomme eine Zeichenfolge für ein Sed-Ersatzmuster
In meinem bash-Skript, ich habe eine externe (empfangen von Benutzer -) saite, die ich verwenden soll, in der sed-Muster.
REPLACE="<funny characters here>"
sed "s/KEYWORD/$REPLACE/g"
Wie kann ich entkommen das $REPLACE
string so wäre es sicher akzeptiert sed
als literal Ersatz?
HINWEIS: Die KEYWORD
ist eine dumme substring keine Spiele etc. Es ist nicht vom Benutzer bereitgestellte.
Kommentar zu dem Problem - Öffnen
Versuchen Sie zu vermeiden, die "Little Bobby Tables" problem, wenn Sie sagen "/g -e 's/PASSWORD=.*/PASSWORD=abc/g'"?
Ja, auch dieses.
Wenn Sie die bash benutzen, benötigen Sie keinen sed. Verwenden Sie einfach die
outputvar="${inputvar//"$txt2replace"/"$txt2replacewith"}".
Siehe auch: stackoverflow.com/q/29613304/45375
@CamiloMartin, siehe mein Kommentar zu meiner eigenen Antwort. Die Anführungszeichen innerhalb der ${} nicht übereinstimmen mit den Anführungszeichen innerhalb. Die beiden Variablen werden nicht außerhalb der Anführungszeichen.
InformationsquelleAutor der Frage Alexander Gladysh | 2009-01-02
Du musst angemeldet sein, um einen Kommentar abzugeben.
Warnung: Dies gilt nicht betrachten Zeilenumbrüche. Für eine weitere ausführliche Antwort siehe diese Frage statt. (Danke, Ed Morton & Niklas Peter)
Beachten Sie, dass die Flucht alles ist eine schlechte Idee. Sed braucht viele Zeichen maskiert werden, um bekommen Ihre spezielle Bedeutung. Zum Beispiel, wenn Sie zu entkommen, eine Stelle in der Ersatz-Zeichenfolge, wird es wiederum in einen Rückverweis.
Als Ben Blank sagte, es sind nur drei Zeichen müssen escaped werden in der Ersatz-Zeichenfolge (entkommt sich selbst, Schrägstrich am Ende der Anweisung und & für alle ersetzen):
Wenn Sie jemals brauchen, um die Flucht der
KEYWORD
Zeichenfolge, die folgende ist die, die Sie brauchen:Denken Sie daran, wenn Sie verwenden ein anderes Zeichen als
/
als Trennzeichen, die Sie benötigen, ersetzen Sie den Schrägstrich in den Ausdrücken oben mit dem Zeichen, das Sie verwenden. Sehen PeterJCLaw Kommentar für die Erklärung.Bearbeitet: Aufgrund von einigen Ausnahmefällen, die zuvor nicht bilanziert, die oben genannten Befehle haben mehrere Male geändert. Überprüfen Sie die edit-history details.
InformationsquelleAutor der Antwort Pianosaurus
Den sed-Befehl können Sie andere Zeichen verwenden, anstatt
/
als Trennzeichen:Die Anführungszeichen sind kein problem.
InformationsquelleAutor der Antwort scre_www
Nur drei literalen Zeichen, die speziell behandelt werden in der replace-Klausel sind
/
(schließen des Satzes),\
(escape-Zeichen, Rückverweis, &c.), und&
(auch die übereinstimmung in der Ersatz -). Also, alles, was Sie tun müssen, ist die Flucht die drei Zeichen:Beispiel:
InformationsquelleAutor der Antwort Ben Blank
Basierend auf Pianosaurus s reguläre Ausdrücke, habe ich ein bash-Funktion, die entweicht beide Schlüsselwort und Ersatz.
Hier ist, wie Sie es verwenden:
InformationsquelleAutor der Antwort Gurpartap Singh
Es ist ein bisschen spät, um zu reagieren... aber es gibt einen viel einfacheren Weg, dies zu tun. Ändern Sie einfach die Trennzeichen (D. H., das Zeichen trennt die Felder). Also, statt
s/foo/bar/
schreiben Sies|bar|foo
.Und, hier ist der einfache Weg, dies zu tun:
Die resultierende Ausgabe ist ohne die eklige DEFINER-Klausel.
InformationsquelleAutor der Antwort user2460464
Es stellt sich heraus, dass Sie die falsche Frage gestellt. Ich fragte auch die falsche Frage. Der Grund, warum es falsch ist, den Anfang des ersten Satzes: "In meinem bash Skript...".
Ich hatte die gleiche Frage und machte den gleichen Fehler. Wenn Sie die bash verwenden, brauchen Sie nicht zu verwenden sed zu tun-string-Ersetzungen (und es ist viel - cleaner, verwenden Sie die replace-Funktion integriert bash).
Sondern so etwas wie zum Beispiel:
können Sie verwenden die bash-features exklusiv:
InformationsquelleAutor der Antwort destenson
Verwenden awk - es ist sauberer:
InformationsquelleAutor der Antwort greggster
Hier ist ein Beispiel eines AWK habe ich eine Weile her. Es ist ein AWK druckt neue AWKS. AWK und SED ähnlich ist es vielleicht eine gute Vorlage.
Sieht es übertrieben, aber irgendwie, die Kombination von Anführungszeichen funktioniert zu halten", gedruckt als Literale. Dann, wenn ich mich richtig erinnere die vaiables sind nur umgeben mit Zitaten wie diesem: "$1". Versuchen Sie es, lassen Sie mich wissen, wie es funktioniert mit SED.
InformationsquelleAutor der Antwort Alex
Wenn der Fall passiert zu sein, dass Sie generieren ein zufälliges Passwort zu übergeben
sed
pattern ersetzen, dann wählen Sie vorsichtig sein, über welche Gruppe von Zeichen in die zufällige Zeichenfolge. Wenn Sie wählen Sie ein Passwort, dass durch Verschlüsselung ein Wert, wie base64, dann gibt es nur Zeichen, das ist möglich in base64 und ist auch ein spezielles Zeichen insed
pattern ersetzen. Das Zeichen "/", und ist bequem aus dem Passwort erzeugt:InformationsquelleAutor der Antwort Mark Stosberg
Ich eine Verbesserung über die sedeasy Funktion, die Sie im Bruch mit speziellen Zeichen wie tab.
Also, was ist anders?
$1
und$2
eingewickelt in Anführungszeichen, um zu vermeiden, shell-Erweiterungen und bewahren tabs oder doppelte Leerzeichen.Zusätzliche Rohrleitungen
| sed -e 's:\t:\\t:g'
(ich mag:
als token), die transformiert ein tab in\t
.InformationsquelleAutor der Antwort Francisco De Zuviria
Nur entkommen alles, was in der REPLACE Variable:
InformationsquelleAutor der Antwort PEZ
vergessen Sie nicht, alle die Freude, die auftreten, mit die shell-Einschränkung um " und '
also (in der ksh)
InformationsquelleAutor der Antwort NeronLeVelu
Wenn Sie gerade auf der Suche zu ersetzen, die Variable Wert in der sed-Befehl dann einfach entfernen
Beispiel:
InformationsquelleAutor der Antwort shailender chauhan
Einen einfacheren Weg dies zu tun ist, nur den Aufbau der saite, bevor die hand, und verwenden Sie es als parameter für
sed
InformationsquelleAutor der Antwort Javonne Martin