Was ist los
Die Shell (Bash) sieht das Argument [a-z]
. Dies ist ein Platzhaltermuster (ein Glob ), das mit jedem Kleinbuchstaben übereinstimmt¹. Daher sucht die Shell nach einem Dateinamen, der diesem Muster entspricht. Es gibt drei Fälle:
- Keine Datei im aktuellen Verzeichnis hat einen Namen, der aus einem einzelnen Kleinbuchstaben besteht. Dann lässt die Shell das Platzhaltermuster unverändert und
tr
sieht die Argumente -d
und [a-z]
. Dies geschieht auf den meisten Ihrer Maschinen.
- Eine einzelne Datei im aktuellen Verzeichnis hat einen Namen, der aus einem einzelnen Kleinbuchstaben besteht. Dann erweitert die Shell das Muster auf diesen Dateinamen und
tr
sieht die Argumente -d
und den Dateinamen. Dies geschieht auf dem Server, und die übereinstimmende Datei wird aufgerufen, o
da wir sehen können, dass tr
der Buchstabe gelöscht wurde o
.
- Zwei oder mehr Dateien im aktuellen Verzeichnis haben einen Namen, der aus einem einzelnen Kleinbuchstaben besteht. Anschließend erweitert die Shell das Muster auf die Liste der übereinstimmenden Dateinamen und
tr
sieht drei oder mehr Argumente: -d
und die Dateinamen. Da tr
nachher ein einziges Argument erwartet wird -d
, wird es sich beschweren.
Was du hätte tun sollen
Wenn das Argument eines Befehls Sonderzeichen enthält, müssen Sie diese maskieren. Setzen Sie das Argument in einfache Anführungszeichen '…'
(dies ist der einfachste Weg, es gibt andere). In einfachen Anführungszeichen stehen alle Zeichen für sich selbst, mit Ausnahme des einfachen Anführungszeichens. Wenn das Argument ein einfaches Anführungszeichen enthält, ersetzen Sie es durch'\''
.
tr -d '[a-z]'
Beachten Sie jedoch, dass dies wahrscheinlich immer noch nicht das ist, was Sie gemeint haben! Dies weist tr
an, Kleinbuchstaben und eckige Klammern zu löschen. Es ist äquivalent zu tr -d ']a-z['
, tr '[]a-z'
usw. Kleinbuchstaben zu löschen, verwenden
tr -d a-z
Das Argument für tr
ist ein Zeichensatz. Sie setzen Klammern um einen Zeichensatz in einem regulären Ausdruck oder einem Platzhaltermuster, um anzuzeigen, dass es sich um einen Zeichensatz handelt. Arbeitet aber jeweils tr
an einem einzelnen Charakter. Die Befehlszeilenargumente werden in Klammern gesetzt .
Sie benötigen Klammern, um Zeichenklassen anzugeben . In einem regulären Ausdruck verwenden Sie Klammern in Klammern, um eine Zeichenklasse anzugeben, z. B. eine [[:lower:]]*
beliebige Anzahl von Kleinbuchstaben, eine [[:lower:]_]*
beliebige Anzahl von Kleinbuchstaben und Unterstrichen. Im Argument von tr
benötigen Sie die Menge ohne die umgebenden Klammern, also werden tr -d '[:lower:]'
Kleinbuchstaben, tr -d '[:lower:]_'
Kleinbuchstaben und Unterstriche usw. gelöscht.
¹ In einigen Gebietsschemas kann es mit anderen Zeichen übereinstimmen .
tr
Bereiche werden ohne Beilage geschrieben[...]
. Sotr -d '[a-z]'
wird getöteta-z
, und auch Charaktere[
und]
. Verwenden Sietr -d a-z
diese Option , um nur Buchstaben zu tötena-z
.