Wie entferne ich einen Dateinamen von Sonderzeichen?

Ich habe eine Datei mit einem Namen wie „heutiges Datum.txt“

Was mich interessiert, ist das Entfernen aller Sonderzeichen mit dem Terminal wie:

" - , ' ' [ 

Der Grund dafür ist, dass ich diese später in ein Skript einbaue und es zu viel Kopfzerbrechen bereitet, die Namen einzeln zu berücksichtigen und zu ändern.

Leerzeichen " " und Unterstriche "_" und das Alphabet "AZ, az" sind in Ordnung, ebenso wie das Ersetzen der Zeichen, anstatt sie zu löschen.

Zuerst dachte ich, der Terminalbefehl "iconv" könnte mir beim Konvertieren in eine einfachere Codierung helfen, aber ich habe mehrere der Codierungen ausprobiert und es scheint, dass ich mich irre.

Ich weiß, dass reguläre Ausdrücke mir helfen könnten, aber leider kenne ich mich nicht gut mit ihnen aus. Ich habe diese Frage gefunden, die real zu sein scheint, aber ich weiß nicht, wie ich sie implementieren soll oder ob sie dieselben Fälle wie meine abdeckt.

Der Grund, warum ich dies hier gepostet habe, ist, dass diese Frage möglicherweise nur für den Zeichensatz gilt, den OSX für Dateinamen und die verwendete Codierung unterstützt ... obwohl es wahrscheinlicher ist, dass ich keine Ahnung habe, wovon ich spreche.

Danke im Voraus für Ihre Hilfe.

Bearbeiten: Der Befehl

sed 's/[!@#\$%^&*()]//g'

Scheint sehr gut zu funktionieren, aber ich kann es nicht für meinen ursprünglichen Anwendungsfall und andere zum Laufen bringen:

' ` "

Auch ihnen zu entkommen funktioniert nicht. Ich bin sehr neu im Bash-Scripting, also haben Sie bitte etwas Geduld mit mir.


Bearbeiten 2: Poste dies hier, sonst müsste ich 6 Stunden warten.

Zusätzlich zu Alan Shutkos Antwort möchte ich meine eigene Lösung hinzufügen, die ich gefunden habe.

awk '{gsub(/[[:punct:]]/,"")}1'

Ich zögere irgendwie, dies zu posten, da ich es nicht gut erklären kann.

Awk wird, wie es auf der Manpage steht, für "mustergesteuerte Scan- und Verarbeitungssprache" verwendet. Die Funktion gsub sucht und ersetzt alle Vorkommen des eingegebenen regulären Ausdrucks. Der gsub-Teil würde so aussehen:

gsub("a","b")

Wobei in meinem Beispiel alle Vorkommen von a durch b ersetzt würden. Wie im obigen Kommentar klingt [[:punct:]] so, als ob es für alle Satzzeichen steht. Allerdings weiß ich nicht, was die 1 außerhalb der Klammern bedeutet.

Antworten (4)

Wenn Sie einen bestimmten Satz von Zeichen haben, den Sie behalten möchten, funktioniert tr sehr gut.

Zum Beispiel

tr -cd 'A-Za-z0-9_-'

Entfernt alle Zeichen, die nicht im aufgelisteten Zeichensatz enthalten sind. (Das -d bedeutet löschen, und das -c bedeutet das Komplement der aufgelisteten Zeichen: Mit anderen Worten, alle nicht aufgelisteten Zeichen werden gelöscht.)

Das ist genau das, wonach ich gesucht habe. Danke dir! Wenn Sie sich die Manpage durchlesen, ist das Flag [:alnum:] genauso effektiv, um alphanumerische Zeichen anzuzeigen. Etwa so: tr -cd [:alphanum:] Wir können die Leerzeichen bis sparen, indem wir [:blank:] einfügen

Dies würde nur einfache Anführungszeichen durch Unterstriche ersetzen:

for f in *; do mv "$f" "${f//'/_}"; done

Dies würde nur alphanumerische ASCII-Zeichen, Unterstriche und Punkte beibehalten:

for f in *; do mv "$f" "$(sed 's/[^0-9A-Za-z_.]/_/g' <<< "$f")"; done

Gebietsschemas wie en_US.UTF-8verwenden die ASCII-Kollatierungsreihenfolge unter OS X, stimmen aber [[:alnum:]]auch \wmit Zeichen wie äin ihnen überein. Ist , LC_CTYPEwerden CMultibyte-Zeichen durch mehrere Unterstriche ersetzt.

Kann man das rekursiv machen?

Ich hatte kürzlich das gleiche Problem und musste die Dateinamen aller Dateien in einem Ordner von Sonderzeichen entfernen. Ich habe diesen Befehl verwendet, der eine Kombination aus beiden hier geposteten Antworten ist, aber auch Perioden beibehält. Vielleicht hilft es jemandem.

for file in *; do echo mv "$file" `echo $file | tr -cd 'A-Za-z0-9_.-'` ; done

das Entfernen echovon vor mv "$file"führt den Befehl aus.

Ich benutze das

for file in *; do echo mv \""$file"\" \"`echo $file | tr -cd 'A-Za-z0-9_-.[] '`\" ; done

Das Entfernen des Echos vor mv "$file" führt den Befehl aus.