Entfernen Sie Backslashes aus einer Textdatei

10

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" Paber er funktioniert nicht und weist auf einen Fehler hin:

character found after backslash is not meaningful
Yisha
quelle
3
Sie scheinen eine Nicht-POSIX-Implementierung von zu haben sed(oder führen Sie diesen Befehl möglicherweise über eine Nicht-POSIX-Shell aus?). Sie brauchen aber nicht sed, trist genug : tr -d '\\' < P.
Stéphane Chazelas

Antworten:

20

Sie können den Backslash entweder durch ein Leerzeichen ersetzen, wie Sie im Beispielergebnis zeigen:

sed 's/\\/ /g'

oder Sie können es entfernen, wie Sie in Ihrem Code zeigen:

sed 's/\\//g'

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.

  1. In einem regulären Ausdruck (Eingabe von Befehlen wie sed, grepetc.) 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.

  2. 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 die sednicht 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'

Pabouk
quelle
6

Sie müssen dem Backslash entkommen. Versuche dies:

sed 's/\\//g'
jherran
quelle
3

Wenn Sie keine sed-Lösungen wünschen, versuchen Sie es mit den folgenden Befehlen:

$ echo "NISHA =\455"| awk -F'\' '{print $1 $2}'
$ echo "NISHA =\455"| tr '\\' ' '
$ echo "NISHA =\455"| tr -d '\\'
$ echo "NISHA =\455"| cut -c 1-7,9-11
αғsнιη
quelle
2

In awk würde ich das gerne tun,

$ echo 'NISHA =\455' | awk '{gsub(/\\/," ")}1'
NISHA = 455
Avinash Raj
quelle
1
sed 's/\\//'

Platzieren Sie ein \Vorher \wie bei den meisten Sonderzeichen.

Anzeigename
quelle
Sie haben die gFlagge 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.
Pabouk