Ich habe ein Visual Studio-Projekt, das lokal entwickelt wird. Codedateien müssen auf einem Remote-Server bereitgestellt werden. Das einzige Problem ist, dass URLs enthalten sind, die fest codiert sind.
Das Projekt enthält URLs wie ? Page = one . Damit der Link auf dem Server gültig ist, muss er / page / one sein .
Ich habe beschlossen, alle URLs in meinen Codedateien vor der Bereitstellung durch sed zu ersetzen, bin aber bei Schrägstrichen geblieben.
Ich weiß, dass dies keine schöne Lösung ist, aber es ist einfach, würde mir viel Zeit sparen. Die Gesamtzahl der zu ersetzenden Zeichenfolgen beträgt weniger als 10. Die Gesamtzahl der zu überprüfenden Dateien beträgt ~ 30.
Ein Beispiel, das meine Situation beschreibt, ist unten:
Befehl, den ich benutze:
sed -f replace.txt < a.txt > b.txt
replace.txt, das alle Zeichenfolgen enthält:
s/?page=one&/pageone/g
s/?page=two&/pagetwo/g
s/?page=three&/pagethree/g
a.txt:
?page=one&
?page=two&
?page=three&
Inhalt von b.txt, nachdem ich meinen sed-Befehl ausgeführt habe:
pageone
pagetwo
pagethree
Was ich möchte, dass b.txt enthält:
/page/one
/page/two
/page/three
Antworten:
Der einfachste Weg wäre, ein anderes Trennzeichen in Ihren Such- / Ersetzungszeilen zu verwenden, z.
Sie können jedes Zeichen als Trennzeichen verwenden, das nicht Teil einer der beiden Zeichenfolgen ist. Oder Sie könnten es mit einem Backslash entkommen:
Welche ersetzen würde
/
mitfoo
. Sie möchten den maskierten Backslash in Fällen verwenden, in denen Sie nicht wissen, welche Zeichen in den Ersatzzeichenfolgen vorkommen können (z. B. wenn es sich um Shell-Variablen handelt).quelle
sed
der Befehl regex in doppelte Anführungszeichen gesetzt wird. Ich habe sie in meiner Antwort nicht verwendet, weil ich nicht die gesamtesed
Befehlszeilesed
angezeigt habe, sondern nur die Regex-Befehlszeichenfolge, wie es das OP getan hatte. Wenn Sie es wie das OP in eine Datei einfügen, benötigen Sie die Anführungszeichen nicht.sed
Befehl in einem Shell-Skript haben, sind möglicherweise weitere Backslashes erforderlich (jeder Backslash muss erneut mit einem Backslash versehen werden).Der
s
Befehl kann ein beliebiges Zeichen als Trennzeichen verwenden. Welches Zeichen auch immer kommt, nachdem dass
verwendet wird. Ich wurde erzogen, um a zu benutzen#
. Wie so:quelle
Eine sehr nützliche, aber weniger bekannte Tatsache über sed ist, dass der vertraute
s/foo/bar/
Befehl jede Interpunktion verwenden kann, nicht nur Schrägstriche. Eine übliche Alternative ists@foo@bar@
, aus der hervorgeht, wie Sie Ihr Problem lösen können.quelle
füge \ vor Sonderzeichen hinzu:
etc.
quelle
s/foo\/bar/foo_bar/
wird funktionieren, wird aber/foo\/bar/foo_bar/
nicht.In einem System, das ich entwickle, ist die durch sed zu ersetzende Zeichenfolge Eingabetext eines Benutzers, der in einer Variablen gespeichert und an sed übergeben wird.
Wie bereits in diesem Beitrag erwähnt, wird sed bei einem Syntaxfehler beendet, wenn die im sed-Befehlsblock enthaltene Zeichenfolge das von sed verwendete Trennzeichen enthält. Betrachten Sie das folgende Beispiel:
Das funktioniert:
Dies bricht:
Das Ersetzen des Standardtrennzeichens ist in meinem Fall keine robuste Lösung, da ich den Benutzer nicht daran hindern wollte, bestimmte Zeichen einzugeben, die von sed als Trennzeichen verwendet werden (z. B. "/").
Das Problem kann jedoch behoben werden, wenn das Trennzeichen in der Eingabezeichenfolge nicht angezeigt wird. Betrachten Sie die folgende Lösung, bei der das Trennzeichen in der Eingabezeichenfolge systematisch maskiert wird, bevor es von sed analysiert wird. Ein solches Escapezeichen kann als Ersatz mit sed selbst implementiert werden. Dieser Ersatz ist auch dann sicher, wenn die Eingabezeichenfolge das Trennzeichen enthält. Dies liegt daran, dass die Eingabezeichenfolge nicht Teil des Befehlsblocks sed ist:
Ich habe dies in eine Funktion konvertiert, die von verschiedenen Skripten verwendet wird:
quelle
VALUE="01\\\/01\\\/2018"
Diese Zeile sollte für Ihre 3 Beispiele funktionieren:
-r
einige Fluchtversuche gerettet.Test mit deinem Beispiel (a.txt):
quelle
replace.txt
sollte seinquelle
Tolle Antwort von Anonymous. \ löste mein Problem, als ich versuchte, Anführungszeichen in HTML-Zeichenfolgen zu umgehen.
Wenn Sie also sed verwenden, um einige HTML-Vorlagen (auf einem Server) zurückzugeben, verwenden Sie einen doppelten Backslash anstelle eines einfachen:
quelle
sed
ist die s tream ed itor , in denen Sie verwenden können|
(Rohr) zu senden Standard - Streams (STDIN und STDOUT spezifisch) durchsed
und verändern sie programmatisch im laufenden Betrieb , es ist ein handliches Werkzeug in der Philosophie Tradition Unix zu machen; Sie können Dateien jedoch auch direkt mit dem-i
unten angegebenen Parameter bearbeiten .Beachten Sie Folgendes :
s/
zu verwendet s ubstitute den gefundenen Ausdruckfew
mitasd
:/g
steht für "global" und bedeutet dies für die gesamte Linie. Wenn Sie das weglassen/g
(mits/few/asd/
, es müssen immer drei Schrägstriche vorhanden sein, egal was passiert) undfew
zweimal in derselben Zeile erscheinen, wird nur der erstefew
geändert inasd
:Dies ist unter bestimmten Umständen hilfreich, z. B. beim Ändern von Sonderzeichen am Anfang von Zeilen (z. B. Ersetzen der Symbole, die größer als sind, um das vorherige Material in E-Mail-Threads zu zitieren, durch eine horizontale Registerkarte, während später in der Zeile eine zitierte algebraische Ungleichung verbleibt unberührt), aber in Ihrem Beispiel, in dem Sie angeben, dass es irgendwo
few
auftreten soll, sollten Sie es ersetzen/g
.Die folgenden zwei Optionen (Flags) werden zu einer zusammengefasst
-ie
:-i
Option zu bearbeiten verwendet i n Platz auf der Dateihello.txt
.-e
Option gibt die e xpression / Befehl ausgeführt werden soll, in diesem Falls/
.Hinweis: Es ist wichtig, dass Sie verwenden
-i -e
zum Suchen / Ersetzen verwenden. Wenn Sie dies tun-ie
, erstellen Sie eine Sicherungskopie jeder Datei mit dem angehängten Buchstaben 'e'.quelle
Eine einfachere Alternative ist die Verwendung von AWK wie bei dieser Antwort :
awk '$0="prefix"$0' file > new_file
quelle