2017-02-19 8 views
1

Ich möchte 2 Fragen über sed stellen.Unterschied sed Befehle sed 's ///' und sed "s ###"

Zum Beispiel, wenn ich versuche, eine Zeichenfolge an sed, die Sonderzeichen wie (. \ N *. +) Und sed kann nicht richtig ausgeführt werden.

set a = ".\n*.\+" 
set input = ".\n*.\+adsdfasdf" 

Dann führen:

echo "$input" | sed 's/'$a'/hi/g' # It will give: sed: No match 

aber

echo "$input" | sed "s#${a}#hi#g" # It will run but not true 

Meine Fragen sind:

  1. Was ist der Unterschied zwischen diesen Befehlen ist: sed 's ///' und sed "s ###"
  2. Wie behandelt man Eingabe genau so, wie sie rein ist?
+0

beide gibt 'Hallo' als Ergebnis für mich auf bash Shell und GNU sed' a = ". \ N *. \ +"; input = ". \ n *. \ + adsdfasdf"; echo "$ input" | sed 's /' $ a '/ hi/g'' .... siehe https://stackoverflow.com/documentation/sed/1096/substitution#t=201702190808137883167 für einige Erklärungen zur Verwendung verschiedener Begrenzer. – Sundeep

+0

afaik, Es gibt keine Möglichkeit, sed mitzuteilen, dass die Zeichenfolge als Literal behandelt werden soll. Sie müssen sowohl die Metazeichen als auch das verwendete Trennzeichen umgehen. – Sundeep

Antwort

0

1. Was ist der Unterschied zwischen diesen Befehlen ist: sed 's ///' und sed "s ###"
--- In Ihrem Fall / oder # ist ein Separator der entscheidend "Sektionen":

der s Befehl (wie in Ersatz) ist wahrscheinlich die wichtigste in sed und eine Menge verschiedener Optionen hat. Die Syntax des Befehls s lautet 's/regexp/ersatz/flags'.
...
Die / Zeichen gleichförmig durch jede andere einzelne Zeichen innerhalb jeder Befehl s gegeben ersetzt werden.


2. Wie Eingang zu behandeln wie es rein Zeichenfolge ist?
--- Zur Erweiterung/a Variablen innerhalb sed Befehl einfügen, sollten diese Variablen oder der gesamte Ausdruck mit doppelte Anführungszeichen eingeschlossen werden:

set a = ".\n*.\+" 
echo "$input" | sed "s/$a/hi/g" 
-1

Schließlich fand ich heraus, dass der Separator MÜSSEN SICH unterschiedlich mit irgendwelchen Zeichen in der Zeichenfolge! Oder es wird einen Fehler verursachen!

Also, jetzt werde ich das Trennzeichen auf # ändern. Es ist wie ein Kommentarzeichen.

+0

Es wurde festgestellt, dass das sed-Trennzeichen auf/und Ihre Muster gesetzt ist enthalten/du musst ihnen entkommen. Wenn Sie ein anderes Trennzeichen (wie |, # usw.) auswählen, das in Ihren Mustern NICHT vorhanden ist, reduzieren Sie das Entweichen. –

+0

Danke. Ich habe es endlich verstanden. – TuanLaDaPoet

+0

Hallo, und willkommen zu Stack Overflow. Bitte posten Sie keine Kommentare als Antworten - nur Inhalte, die tatsächlich versuchen, die Frage zu beantworten, sollten mit der Schaltfläche "Post Your Answer" gepostet werden. Ein Moderator kann dies in einen Kommentar umwandeln, aber der übliche Weg, um hier Danke zu sagen, ist den Klick auf den Pfeil neben den Dingen, die Sie mögen, und vielleicht das grüne Häkchen neben der Antwort, die Ihnen am besten gefällt. – tripleee

0

Nun, haben Sie eine \n in der Eingabezeichenfolge, die Sie ohne Anführungszeichen Trennzeichen in 's/'$a'/hi/g' ersetzen und ist als ein Raum analysiert, so kommt man tatsächlich zwei Parameter sed(1) und Sie ersetzen als nur einen Parameter (mit der \n als ein Zeichen enthalten) in nur einem Parameter in "s#$a#hi#g" (in denen doppelte Anführungszeichen die Variablensubstitution enthalten).Es gibt tatsächlich keinen Unterschied in dem Zeichen, das als Trennzeichen in sed(1) verwendet wird, aber Sie haben es anders in den zwei Aufrufen aufgerufen.