Qu'est-ce qui se passe
Le shell (bash) voit l'argument [a-z]
. C'est un motif générique (un glob ), qui correspond à n'importe quelle lettre minuscule¹. Par conséquent, le shell recherche un nom de fichier correspondant à ce modèle. Il y a trois cas:
- Aucun fichier du répertoire en cours ne porte un nom composé d'une seule lettre minuscule. Ensuite, le shell laisse le modèle générique inchangé et
tr
voit les arguments -d
et [a-z]
. C'est ce qui se passe sur la plupart de vos machines.
- Un fichier unique dans le répertoire en cours a un nom qui est une seule lettre minuscule. Ensuite, le shell étend le modèle à ce nom de fichier et
tr
voit les arguments -d
et le nom de fichier. Cela se produit sur le serveur, et le fichier correspondant est appelé o
car nous pouvons voir que tr
la lettre a été supprimée o
.
- Deux fichiers ou plus dans le répertoire en cours ont un nom qui est une seule lettre minuscule. Ensuite, le shell étend le modèle à la liste des noms de fichiers correspondants et
tr
voit au moins trois arguments: -d
et les noms de fichiers. Comme tr
attend un seul argument après -d
, il va se plaindre.
Ce que tu aurais dû faire
S'il y a des caractères spéciaux dans l'argument d'une commande, vous devez les échapper. Mettez l'argument entre guillemets simples '…'
(c'est le moyen le plus simple, il y en a d'autres). À l'intérieur des guillemets simples, tous les personnages se distinguent, à l'exception de la guillemet simple lui-même. S'il y a une seule citation à l'intérieur de l'argument, remplacez-la par'\''
.
tr -d '[a-z]'
Notez cependant que ce n'est probablement pas ce que vous vouliez dire! Cela indique tr
de supprimer les lettres minuscules et les crochets. Il est équivalent à tr -d ']a-z['
, tr '[]a-z'
etc. Pour supprimer des lettres minuscules, utilisez
tr -d a-z
L'argument de tr
est un jeu de caractères. Vous mettez des crochets autour d'un jeu de caractères dans une expression régulière ou un motif générique pour indiquer qu'il s'agit d'un jeu de caractères. Mais tr
fonctionne sur un seul personnage à la fois. Ses arguments de ligne de commande sont ce que vous mettriez entre crochets .
Vous avez besoin de crochets pour indiquer les classes de caractères . Dans une expression régulière, vous utilisez des crochets entre crochets pour indiquer une classe de caractères, par exemple, [[:lower:]]*
correspond à n'importe quel nombre de lettres minuscules, [[:lower:]_]*
correspond à n'importe quel nombre de lettres minuscules et de soulignements. Dans l'argument de tr
, vous avez besoin de l'ensemble sans ses crochets, donc tr -d '[:lower:]'
supprime les lettres minuscules, tr -d '[:lower:]_'
supprime les lettres minuscules et les traits de soulignement, etc.
¹ Dans certains pays, il peut correspondre à d'autres caractères .
tr
plages sont écrites sans les entourer[...]
. Ainsitr -d '[a-z]'
tueraa-z
, et aussi des personnages[
et]
. Utiliseztr -d a-z
pour tuer seulement des lettresa-z
.