it-swarm.com.de

Wie ersetzt man Strings, die Schrägstriche enthalten, mit sed?

Ich habe ein Visual Studio-Projekt, das lokal entwickelt wird. Codedateien müssen auf einem Remote-Server bereitgestellt werden. Das einzige Problem sind URLs, die hartcodiert sind.

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, aber ich stecke bei Schrägstrichen.

Ich weiß, dass dies keine hübsche Lösung ist, aber es wäre einfach, würde mir viel Zeit sparen. Die Gesamtzahl der Zeichenfolgen, die ich ersetzen muss, beträgt weniger als 10. Die Gesamtzahl der zu prüfenden Dateien beträgt ~ 30.

Ein Beispiel, das meine Situation beschreibt, ist unten:

Befehl, den ich verwende:

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 b.txt enthalten soll:

/page/one
/page/two
/page/three
113
afaf12

Der einfachste Weg wäre die Verwendung eines anderen Trennzeichens in Ihren Such-/Ersetzungszeilen, z.

s:?page=one&:pageone:g

Sie können ein beliebiges Zeichen als Trennzeichen verwenden, das nicht Teil einer Zeichenfolge ist. Oder Sie könnten es mit einem Backslash entkommen.

223
lurker

Der Befehl s kann ein beliebiges Zeichen als Trennzeichen verwenden. Welches Zeichen auch immer nach der s verwendet wird. Ich wurde mit einem # erzogen. So wie:

s#?page=one&#/page/one#g
83
Tom Anderson

Eine sehr nützliche, aber weniger bekannte Tatsache über sed ist, dass der bekannte s/foo/bar/-Befehl jede Interpunktion verwenden kann, nicht nur Schrägstriche. Eine gebräuchliche Alternative ist [email protected]@[email protected], aus der ersichtlich wird, wie Sie Ihr Problem lösen.

51
John Zwinck

vor Sonderzeichen hinzufügen

    s/\?page=one&/page\/one\//g

usw

5
Ilja

In einem System, das ich entwickle, ist der String, der durch sed ersetzt werden soll, Eingabetext eines Benutzers, der in einer Variablen gespeichert und an sed übergeben wird.

Wie bereits erwähnt, wird der im sed-Befehlsblock enthaltene String mit dem tatsächlich von sed verwendeten Begrenzer beendet - sed endet dann mit einem Syntaxfehler. Betrachten Sie das folgende Beispiel:

Das funktioniert:

$ VALUE=12345
$ echo "MyVar=%DEF_VALUE%" | sed -e s/%DEF_VALUE%/${VALUE}/g
MyVar=12345

Das bricht:

$ VALUE=12345/6
$ echo "MyVar=%DEF_VALUE%" | sed -e s/%DEF_VALUE%/${VALUE}/g
sed: -e expression #1, char 21: unknown option to `s'

Das Ersetzen des Standardbegrenzers ist in meinem Fall keine robuste Lösung, da ich den Benutzer nicht auf die Eingabe bestimmter Zeichen beschränken möchte, die von sed als Begrenzer verwendet werden (z. B. "/").

Wenn Sie jedoch das Vorkommen des Trennzeichens in der Eingabezeichenfolge umgehen, wird das Problem gelöst. Betrachten Sie die folgende Lösung, indem Sie das Begrenzungszeichen in der Eingabezeichenfolge systematisch umgehen, bevor es von sed ..__ analysiert wird Als Ersatz für sed selbst ist dieser Ersatz sicher, auch wenn die Eingabezeichenfolge das Trennzeichen enthält. Dies ist darauf zurückzuführen, dass die Eingabezeichenfolge nicht Teil des Befehlsblocks sed ist:

$ VALUE=$(echo ${VALUE} | sed -e "s#/#\\\/#g")
$ echo "MyVar=%DEF_VALUE%" | sed -e s/%DEF_VALUE%/${VALUE}/g
MyVar=12345/6

Ich habe dies in eine Funktion umgewandelt, die von verschiedenen Skripten verwendet werden kann:

escapeForwardSlashes() {

     # Validate parameters
     if [ -z "$1" ]
     then
             echo -e "Error - no parameter specified!"
             return 1
     fi

     # Perform replacement
     echo ${1} | sed -e "s#/#\\\/#g"
     return 0
}
4
Yoav Drori

diese Zeile sollte für Ihre 3 Beispiele funktionieren:

sed -r 's#\?(page)=([^&]*)&#/\1/\2#g' a.txt
  • Ich habe -r verwendet, um etwas Flucht zu speichern.
  • die Zeile sollte generisch für Ihren einen, zwei, drei Fall sein. Sie müssen das Sub 3-mal nicht machen

teste mit deinem Beispiel (a.txt):

kent$  echo "?page=one&
?page=two&
?page=three&"|sed -r 's#\?(page)=([^&]*)&#/\1/\2#g'
/page/one
/page/two
/page/three
3
Kent

sed ist der s tream ed itor , in dem Sie | (Pipe) verwenden können, um Standardstreams (speziell STDIN und STDOUT) über sed zu senden und zu ändern programmgesteuert im Fluge, was es zu einem praktischen Werkzeug in der Unix-Philosophie macht; Sie können jedoch auch Dateien direkt bearbeiten, indem Sie den unten angegebenen -i-Parameter verwenden.
Folgendes berücksichtigen:

sed -i -e 's/few/asd/g' hello.txt

s/ wird verwendet, um s den gefundenen Ausdruck few mit asd zu ersetzen:

Die wenigen, die Mutigen.


Der Asd, der Mutige.

/g steht für "global", also für die gesamte Zeile. Wenn Sie den /g (mit s/few/asd/) weglassen, müssen immer drei Schrägstriche verwendet werden, und few erscheint zweimal in derselben Zeile, nur der erste few wird in asd geändert:

Die wenigen Männer, die wenigen Frauen, die Mutigen.


Die Männer, die wenigen Frauen, die Mutigen.

Dies ist in bestimmten Situationen hilfreich, z. B. beim Ändern von Sonderzeichen am Anfang von Zeilen (z. B. Ersetzen der über-als-Symbole, die einige Benutzer verwenden, um vorheriges Material in E-Mail-Threads mit einem horizontalen Tab zu zitieren, während später in der Zeile eine zitierte algebraische Ungleichung bleibt unberührt), aber in Ihrem Beispiel, in dem Sie angeben, dass irgendwofew vorkommt, sollte es ersetzt werden. Stellen Sie sicher, dass Sie /g haben.

Die folgenden zwei Optionen (Flags) werden zu einer -ie zusammengefasst:

Die -i-Option wird zum Bearbeiten von i n der Datei hello.txt verwendet.

Die Option -e gibt den auszuführenden e xpression/-Befehl an, in diesem Fall s/.

Hinweis: Es ist wichtig, dass Sie -i -e zum Suchen/Ersetzen verwenden. Wenn Sie -ie tun, erstellen Sie eine Sicherungskopie jeder Datei mit dem angehängten Buchstaben 'e'.

2

replace.txt sollte sein 

s/?page=/\/page\//g
s/&//g
1
Ion Cojocaru

Tolle Antwort von Anonymous. Ich habe mein Problem gelöst, als ich versuchte, Anführungszeichen in HTML-Strings zu schützen.

Wenn Sie sed verwenden, um einige HTML-Vorlagen (auf einem Server) zurückzugeben, verwenden Sie statt eines einfachen doppelten Backslash:

var htmlTemplate = "<div style=\\"color:green;\\"></div>";
1
Sirar Salih

Eine einfachere Alternative ist die Verwendung von AWK als diese Antwort

awk '$0="prefix"$0' file > new_file

0
Mark