Ao escrever um script, eu queria substituir todos os caracteres, exceto alfa ([a-zA-Z]) por uma quebra de linha. Por definição, ao usar o sinalizador -c (complemento de conjunto), tr deve substituir todos os caracteres que não estão no SET1 pelo caractere especificado no SET2. No entanto, não funciona como esperado... Tente isto:
echo '[[:lower:]]' | tr -c '[a-zA-Z]' '\n'
Saída que recebo:
[[
lower
]]
Como pode ser visto, ele substitui colunas, mas não colchetes, que deveria substituir.
Alguém pode esclarecer isso?
Responder1
tr
não interpreta classes de caracteres nesse estilo regex.
[a-zA-Z]
é interpretado como um conjunto de [
, o intervalo de caracteres de a
até z
e ]
.
Portanto, seu complemento é o conjunto de caracteres que inclui todos os caracteres [
, mas o intervalo de caracteres de a
até z
e ]
.
É por isso que [
e ]
não são substituídos.
Para substituir qualquer caractere não alfabético, basta especificar a-zA-Z
como complemento do conjunto a ser substituído:
echo '[[:lower:]]' | tr -c 'a-zA-Z' '\n'
% echo '[[:lower:]]' | tr -c 'a-zA-Z' '\n'
lower
%