tr
não interpreta classes de caracteres nesse estilo regex.
[a-zA-Z]
é interpretado como um conjunto de [
, o intervalo de caracteres de a
a z
e ]
.
Portanto, seu complemento é o conjunto de caracteres, incluindo todos os caracteres, mas [
, o intervalo de caracteres de a
a 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 o complemento do conjunto a ser substituído:
echo '[[:lower:]]' | tr -c 'a-zA-Z' '\n'
% echo '[[:lower:]]' | tr -c 'a-zA-Z' '\n'
lower
%