ich habe
Eingang:
NISHA =\455
Ausgabe:
NISHA = 455
Ich möchte \
aus der Ausgabe entfernen . Ich habe versucht, den Befehl zu verwenden, sed "s/[\]//g" P
aber er funktioniert nicht und weist auf einen Fehler hin:
character found after backslash is not meaningful
sed
regular-expression
Yisha
quelle
quelle
sed
(oder führen Sie diesen Befehl möglicherweise über eine Nicht-POSIX-Shell aus?). Sie brauchen aber nichtsed
,tr
ist genug :tr -d '\\' < P
.Antworten:
Sie können den Backslash entweder durch ein Leerzeichen ersetzen, wie Sie im Beispielergebnis zeigen:
oder Sie können es entfernen, wie Sie in Ihrem Code zeigen:
Spezielle Charaktere
Es gibt mögliche Probleme beim Entkommen von Backslash, um seine spezielle Bedeutung aufzuheben. Backslash ist ein Sonderzeichen, das zum Escapezeichen sowohl in einer Shell als auch in regulären Ausdrücken verwendet wird.
Der Befehl, den Sie in die Befehlszeile der Shell oder in ein Skript eingeben, wird zuerst von der Shell verarbeitet, die die spezielle Bedeutung von Zeichen und deren Escapezeichen interpretiert. Das Ergebnis wird dann an den auszuführenden Befehl (like
sed
) übergeben, der eine eigene Interpretation der Zeichen durchführt. Wenn Sie einen Befehl erstellen, ist die mentale Prozedur umgekehrt: Fügen Sie zuerst das Escapezeichen für den regulären Ausdruck und dann das Escapezeichen für die Shell hinzu.In einem regulären Ausdruck (Eingabe von Befehlen wie
sed
,grep
etc.) Backslash kann durch Backslash wie folgt entwertet werden:\\
und auch können Sie die Set - Ausdruck verwenden ,[\]
wie Sie verwendet , da es Backslash seine besondere Bedeutung verliert.In einer Shell (wie
bash
) können Sie Backslash für Backslash entkommen. Also anstatt zu\
schreiben\\
. Das Einschließen der Zeichenfolge zwischen doppelte Anführungszeichen"
macht das Backslash-Verhalten komplizierter <1>, aber ein doppelter Backslash erzeugt immer noch einen einzelnen Backslash. Wenn Sie die Zeichenfolge zwischen einfache Anführungszeichen setzen,'
wird jedes Zeichen mit Ausnahme von wörtlich behandelt'
.Wenn Sie doppelte Anführungszeichen verwenden möchten , können Sie eine der folgenden Optionen verwenden :
sed "s/\\\\//g"
- Escape\
by\
in der Shell und Escape alle\
in der Regex erneut. Tatsächlich sind in diesem Fall keine doppelten Anführungszeichen erforderlich, da jedes Sonderzeichen ordnungsgemäß maskiert wird.sed "s/[\\]//g"
- Escape in der Shell durch einen Backslash\
und in der Regex ein Set verwenden[
]
.sed "s/[\]//g"
- Ja, Ihr Beispiel sollte in einer POSIX-kompatiblen Umgebung funktionieren! Zwischen doppelten Anführungszeichen\
stellt sich selbst dar, es sei denn, es steht im Zusammenhang mit doppelten Anführungszeichen vor einem Sonderzeichen:$`"\
oder einer neuen Zeile. Es sieht so aus, als ob in Ihrem Fall entweder die Shell oder diesed
nicht dem POSIX-Standard entspricht.Bei einfachen Anführungszeichen können Sie die Zeichenfolge auch so verwenden, wie Sie sie verwendet haben, oder auf kürzere Weise:
sed 's/[\]//g'
sed 's/\\//g'
quelle
Sie müssen dem Backslash entkommen. Versuche dies:
quelle
Wenn Sie keine sed-Lösungen wünschen, versuchen Sie es mit den folgenden Befehlen:
quelle
In awk würde ich das gerne tun,
quelle
Platzieren Sie ein
\
Vorher\
wie bei den meisten Sonderzeichen.quelle
g
Flagge aus unbekannten Gründen weggelassen . Dies ändert das Verhalten des Befehls, aber eine solche Änderung wurde in der Frage nicht angefordert. Andernfalls bringt Ihre Antwort im Vergleich zu den früheren Antworten nichts Neues.