Tengo un servidor en particular que exhibe un comportamiento extraño cuando uso tr. Aquí hay un ejemplo de un servidor que funciona:
-bash-3.2$ echo "abcdefghijklmnopqrstuvwxyz1234567890"|tr -d [a-z]
1234567890
-bash-3.2$
Eso tiene mucho sentido para mí.
Esto, sin embargo, es del servidor 'especial':
[root@host~]# echo "abcdefghijklmnopqrstuvwxyz1234567890"|tr -d [a-z]
abcdefghijklmnpqrstuvwxyz1234567890
Como puede ver, la eliminación de todos los caracteres en minúscula falla. PERO, ha eliminado la letra 'o'
La parte interesante son los siguientes dos ejemplos, que no tienen ningún sentido para mí:
[root@host~]# echo "abcdefghijklmnopqrstuvwxyz1234567890"|tr -d [a-n]
opqrstuvwxyz1234567890
[root@host~]# echo "abcdefghijklmnopqrstuvwxyz1234567890"|tr -d [a-o]
abcdefghijklmnpqrstuvwxyz1234567890
[root@host~]#
(de nuevo, la 'o' se elimina en el último ejemplo)
¿Alguien tiene alguna idea de lo que está pasando aquí? No puedo reproducir en ninguna otra caja de Linux que estoy usando.
shell
command-line
wildcards
tr
Chris
fuente
fuente

trrangos se escriben sin encerrar[...]. Asítr -d '[a-z]'mataráa-z, y también personajes[y]. Usetr -d a-zpara matar solo letrasa-z.Respuestas:
tienes un archivo nombrado
oen el directorio actualShell expandirá la
[a-z]cadena si se encuentra una coincidencia.Esto se llama expansión de nombre de ruta, de acuerdo con
man bashbash realizará la expansión.
fuente
echo:touch o ; echo tr -d [a-z]da esto:tr -d oQué está pasando
El shell (bash) ve el argumento
[a-z]. Ese es un patrón comodín (un globo ), que coincide con cualquier letra minúscula¹. Por lo tanto, el shell busca un nombre de archivo que coincida con este patrón. Hay tres casos:trve los argumentos-dy[a-z]. Esto es lo que sucede en la mayoría de sus máquinas.trve los argumentos-dy el nombre del archivo. Esto sucede en el servidor, y se llama al archivo correspondienteoya que podemos ver quetreliminó la letrao.trve tres o más argumentos:-dy los nombres de los archivos. Comotrespera un único argumento después-d, se quejará.Lo que deberías haber hecho
Si hay caracteres especiales en el argumento de un comando, debe escapar de ellos. Ponga el argumento entre comillas simples
'…'(esta es la forma más simple, hay otras). Dentro de las comillas simples, todos los personajes se representan a sí mismos, excepto la comilla simple. Si hay una comilla simple dentro del argumento, reemplácela por'\''.Sin embargo, tenga en cuenta que esto probablemente no sea lo que quería decir. Esto le indica
trque elimine las letras minúsculas y los corchetes. Es equivalente atr -d ']a-z[',tr '[]a-z', etc. Para eliminar letras minúsculas, el usoEl argumento para
tres un conjunto de caracteres. Pone corchetes alrededor de un conjunto de caracteres en una expresión regular o patrón comodín para indicar que es un conjunto de caracteres. Perotrfunciona en un solo personaje a la vez. Sus argumentos de línea de comando son lo que pondría dentro de los corchetes .Necesita paréntesis para indicar las clases de caracteres . En una expresión regular, utiliza corchetes dentro de corchetes para indicar una clase de caracteres, por ejemplo,
[[:lower:]]*coincide con cualquier número de letras minúsculas,[[:lower:]_]*coincide con cualquier número de letras minúsculas y guiones bajos. En el argumento detr, necesita el conjunto sin sus corchetes circundantes, por lo quetr -d '[:lower:]'elimina letras minúsculas,tr -d '[:lower:]_'elimina letras minúsculas y guiones bajos, etc.¹ En algunos entornos locales puede coincidir con otros caracteres .
fuente
tr -d '[a-z]'con/usr/bin/tr. Con/usr/xpg4/bin/tr,tr -d a-zfunciona perotr -d '[a-z]'no elimina[ni]./usr/xpg4/bin/tr -d '[a-z]'no se elimina[ni]aparentemente se corrigió en Solaris 11.