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
tr
rangos se escriben sin encerrar[...]
. Asítr -d '[a-z]'
mataráa-z
, y también personajes[
y]
. Usetr -d a-z
para matar solo letrasa-z
.Respuestas:
tienes un archivo nombrado
o
en 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 bash
bash realizará la expansión.
fuente
echo
:touch o ; echo tr -d [a-z]
da esto:tr -d o
Qué 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:tr
ve los argumentos-d
y[a-z]
. Esto es lo que sucede en la mayoría de sus máquinas.tr
ve los argumentos-d
y el nombre del archivo. Esto sucede en el servidor, y se llama al archivo correspondienteo
ya que podemos ver quetr
eliminó la letrao
.tr
ve tres o más argumentos:-d
y los nombres de los archivos. Comotr
espera 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
tr
que 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
tr
es 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. Perotr
funciona 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-z
funciona perotr -d '[a-z]'
no elimina[
ni]
./usr/xpg4/bin/tr -d '[a-z]'
no se elimina[
ni]
aparentemente se corrigió en Solaris 11.