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

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'


6

Sie müssen dem Backslash entkommen. Versuche dies:

sed 's/\\//g'

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

2

In awk würde ich das gerne tun,

$ echo 'NISHA =\455' | awk '{gsub(/\\/," ")}1'
NISHA = 455

1
sed 's/\\//'

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


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.