web-dev-qa-db-de.com

Alle Sonderzeichen aus einer Zeichenfolge in Bash entfernen

Ich habe viel Text in Kleinbuchstaben, das einzige Problem ist, dass es viele Sonderzeichen gibt, die ich auch mit Zahlen entfernen möchte.

Der nächste Befehl ist nicht stark genug:

tr -cd '[alpha]\n '

Im Falle von éćščž und einigen anderen gibt es "?" Aber ich möchte sie alle entfernen. Gibt es einen stärkeren Befehl?

Ich verwende Linux Mint 4.3.8 (1) -release 

7
Marta Koprivnik

Sie können tr verwenden, um nur die druckbaren Zeichen aus einer Zeichenfolge wie unten zu drucken. Verwenden Sie einfach den folgenden Befehl für Ihre Eingabedatei.

tr -cd "[:print:]\n" < file1   

Das Flag -d dient zum Löschen der in den Argumenten des Eingabestroms definierten Zeichensätze, und -c dient zur Ergänzung dieser Zeichen (invertieren Sie das bereitgestellte). Ohne -c würde der Befehl also alle druckbaren Zeichen aus dem Eingabestrom löschen und durch die Verwendung dieses Befehls die Zeichen nicht druckbare entfernen. Wir behalten auch das Newline-Zeichen \n bei, um die Zeilenenden in der Eingabedatei beizubehalten. Wenn Sie es entfernen, wird nur die endgültige Ausgabe in einer großen Zeile erzeugt.

Der [:print:] ist nur ein POSIX-Klammerausdruck der eine Kombination der Ausdrücke [:alnum:], [:punct:] und Leerzeichen ist. Die [:alnum:] ist die gleiche wie [0-9A-Za-z] und [:punct:] umfasst Zeichen !"#$%&'()*+,-./:;<=>?@[\]^_`{|}~

16
Inian

Ich bin mir nicht ganz sicher, woher der Text in Ihrer Frage kommt, aber sagen wir einfach, dass "viel Text in Kleinbuchstaben" in der Datei special.txt steht. Sie könnten so etwas wie das Folgende tun, aber mehr auf die Zeichen, die Sie behalten möchten : 

cat special.txt | sed 's/[^a-z  A-Z]//g'

Es ist ein bisschen wie eine Operation mit einer Axt.

Eine andere mögliche Lösung in der Post Nicht-ASCII-Zeichen aus ... entfernen

Wenn das oben genannte Problem Ihre Frage nicht löst, versuchen Sie bitte, ein bisschen mehr Details anzugeben, und ich kann möglicherweise eine ausführlichere Antwort geben.

3

Ich wollte nur meinen Beitrag dazu leisten. Mit dem folgenden Code können Sie alle Zeichen wie oben beschrieben loswerden. Sie werden durch Leerzeichen ersetzt und behalten gleichzeitig den Zeilenvorschubcharakter

    tr -s "[:punct:]" " "

Von manuellen Eingaben -s 

Drücken Sie mehrere Vorkommen der im letzten Operanden aufgelisteten Zeichen (entweder string1 oder string2) in der Eingabe in eine einzige Instanz des Zeichens. Dies geschieht, nachdem alle Löschvorgänge abgeschlossen und die Übersetzung abgeschlossen ist.