Eu tenho um servidor específico que está exibindo um comportamento estranho ao usar tr. Aqui está um exemplo de um servidor de trabalho:
-bash-3.2$ echo "abcdefghijklmnopqrstuvwxyz1234567890"|tr -d [a-z]
1234567890
-bash-3.2$
Isso faz todo o sentido para mim.
Isso, no entanto, é do servidor 'especial':
[root@host~]# echo "abcdefghijklmnopqrstuvwxyz1234567890"|tr -d [a-z]
abcdefghijklmnpqrstuvwxyz1234567890
Como você pode ver, a exclusão de todos os caracteres minúsculos falha. MAS, ele excluiu a letra 'o'
A parte interessante são os dois exemplos a seguir, que não fazem sentido para mim:
[root@host~]# echo "abcdefghijklmnopqrstuvwxyz1234567890"|tr -d [a-n]
opqrstuvwxyz1234567890
[root@host~]# echo "abcdefghijklmnopqrstuvwxyz1234567890"|tr -d [a-o]
abcdefghijklmnpqrstuvwxyz1234567890
[root@host~]#
(novamente, o 'o' é excluído no último exemplo)
Alguém tem alguma idéia do que está acontecendo aqui? Não consigo reproduzir em nenhuma outra caixa Linux que estou usando.
shell
command-line
wildcards
tr
Chris
fonte
fonte
tr
intervalos são gravados sem o anexo[...]
. Entãotr -d '[a-z]'
vai matara-z
, e também personagens[
e]
. Usetr -d a-z
para matar apenas letrasa-z
.Respostas:
você tem um arquivo nomeado
o
no diretório atualshell expandirá a
[a-z]
string se uma correspondência for encontrada.Isso é chamado de expansão do nome do caminho, de acordo com
man bash
o bash executará a expansão.
fonte
echo
:touch o ; echo tr -d [a-z]
dá a este:tr -d o
O que está acontecendo
O shell (bash) vê o argumento
[a-z]
. Esse é um padrão curinga ( glob ), que corresponde a qualquer letra minúscula¹. Portanto, o shell procura um nome de arquivo que corresponda a esse padrão. Existem três casos:tr
vê os argumentos-d
e[a-z]
. É o que acontece na maioria das suas máquinas.tr
vê os argumentos-d
e o nome do arquivo. Isso acontece no servidor e o arquivo correspondente é chamado,o
pois podemos ver quetr
a letra foi excluídao
.tr
vê três ou mais argumentos:-d
e os nomes dos arquivos. Comotr
espera um único argumento depois-d
, ele irá reclamar.O que você deveria ter feito
Se houver caracteres especiais no argumento de um comando, você deverá escapar deles. Coloque o argumento entre aspas simples
'…'
(esta é a maneira mais simples, existem outras). Dentro de aspas simples, todos os caracteres se representam, exceto a própria aspas simples. Se houver uma aspas simples dentro do argumento, substitua-o por'\''
.No entanto, note que isso provavelmente ainda não é o que você quis dizer! Isso indica
tr
para excluir letras minúsculas e colchetes. É equivalente atr -d ']a-z['
,tr '[]a-z'
etc. Para excluir letras minúsculas, useO argumento para
tr
é um conjunto de caracteres. Você coloca colchetes em torno de um conjunto de caracteres em uma expressão regular ou padrão curinga para indicar que é um conjunto de caracteres. Mastr
funciona em um único personagem de cada vez. Seus argumentos de linha de comando são o que você colocaria dentro dos colchetes .Você precisa de colchetes para indicar as classes de caracteres . Em uma expressão regular, você usa colchetes entre colchetes para indicar uma classe de caracteres, por exemplo,
[[:lower:]]*
corresponde a qualquer número de letras minúsculas,[[:lower:]_]*
corresponde a qualquer número de letras minúsculas e sublinhados. No argumento detr
, você precisa do conjunto sem os colchetes, portanto,tr -d '[:lower:]'
exclui letras minúsculas,tr -d '[:lower:]_'
exclui letras minúsculas e sublinhados, etc.¹ Em alguns locais, pode corresponder a outros caracteres .
fonte
tr -d '[a-z]'
com/usr/bin/tr
. Com/usr/xpg4/bin/tr
,tr -d a-z
funciona , mastr -d '[a-z]'
não exclui[
nem]
./usr/xpg4/bin/tr -d '[a-z]'
não foi[
]