Warum benötigt sed 3 Backslashes für einen regulären Backslash?
Ich bin neugierig, warum sed müssen 3 \
einfach zu erkennen? Ich würde verstehen, es braucht 2, aber 3 weiß ich nicht.
EDIT: hier ein Beispiel auf meinem Windows Rechner mit Cygwin:
echo "sample_input\whatever" | sed "s/\\\/\//"
Wenn ich nicht hinzufügen, 3 backslashes, bekomme ich eine
sed: -e expression #1, char 7: unterminated s' command
InformationsquelleAutor der Frage Geo | 2010-03-03
Du musst angemeldet sein, um einen Kommentar abzugeben.
War ich in der Lage, dieses Verhalten zu reproduzieren mit Vista und Cygwin 1.7.0.
Zwei umgekehrte Schrägstriche zu einem einzelnen backslash in der shell, dann in der sed entgeht dem Schrägstrich ist die mittlere Trennzeichen.
Drei von Ihnen: Die ersten zwei, eins in der shell, die dann die Flucht der Dritten im sed
Vier: Jedes paar nur diejenigen, die in die Schale, dann die erste resultierende einer entkommt, der zweite in der sed
Edit:
Oh, ich vergaß zu sagen, dass sowohl single-quotes und double-quotes gearbeitet, das gleiche für mich (
cmd.exe
macht keine Unterscheidung, Bash, et al, macht).InformationsquelleAutor der Antwort Dennis Williamson
Ihre shell (wahrscheinlich bash) ist dabei seinen eigenen zu entkommen, und das ist verwirrend. Sie können einen echo-Befehl, um zu sehen, was übergeben wird, oder es ist einfach zum schreiben eines benutzerdefinierten Programms (normalerweise mit der Bezeichnung "showargs" oder ähnlich):
Können Sie auch einfache Anführungszeichen, die werden anders behandelt als in der bash.
InformationsquelleAutor der Antwort
Dass aufgrund
sh
's double-quoted string-parsing-Regel.Posix gibt an, wie
sh
analysiert double-quoted strings.In anderen Worten,
sh
bleibt der backslash gefolgt von andere Zeichen als $ '" .So, wenn
sh
erfüllt die double-quoted stringsed "s/\\\/\//"
sh
analysiert Sie wie folgt vor.\\
ist geändert in\
. Da die erste\
ist, gefolgt von der zweiten\
.\
ist noch im string. Weil beide von Ihnen sind gefolgt von/
die kein Sonderzeichen in Strings mit doppelten Anführungszeichen.Nach pasring,
sh
übergibt die Zeichenfolges/\\/\//
zused
ersetzt das erste auftreten von\
in/
.Mit der gleichen Argumentation, wenn
sh
entspricht der Zeichenkette,"sed s/\\\\/\//"
sh
geht/\\/\//
zused
die auch ersetzt das erste auftreten von\
in/
.InformationsquelleAutor der Antwort MS.Kim
Bitte ein Beispiel zeigen, was Sie in der Zukunft haben. in der sed, sagen Sie, Sie wollen zu ersetzen "
\
" mit pipe (|), zum Beispielbrauchen Sie nur zu entkommen, es einmal.
Edit: @OP ' s Beispiel, da Sie über cmd.exe und nicht bash/ksh, cmd.exe nicht wie einfache Anführungszeichen. Ich kann nicht produzieren Szenario. Dies funktioniert für mein GNU sed auf windows mit 2 Schrägstrichen
zB
InformationsquelleAutor der Antwort ghostdog74
In meiner version von CYGWIN, es funktioniert wie das original-poster sagt, aber anders funktioniert (normalerweise), wenn ich einfache Anführungszeichen.
Hmmm..
InformationsquelleAutor der Antwort James K
Ich denke, Sie Voraus, dass
\\\n
oder\\\t
als drei backslashes gibt, aber tatsächlich, seine 2 backslashes und einem anderen Musterauch
/
vielleicht müssen Sie fliehen, weil ins/.../
/
für öffnen und schließen Teile.so
/\\\/\//
wäre\\ + \/+ \/
nach Ihren aktualisiertes BeispielInformationsquelleAutor der Antwort YOU
Ersetzt ein Schrägstrich mit zwei auf meine Cygwin-dies erfordert Ausdruck:
sed -e "s|\\|\\\\|g"
InformationsquelleAutor der Antwort OutputLogic