tr -c '[a-zA-Z]' '\n' não substituindo todos os caracteres complementares

tr -c '[a-zA-Z]' '\n' não substituindo todos os caracteres complementares

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

trnão interpreta classes de caracteres nesse estilo regex.

[a-zA-Z]é interpretado como um conjunto de [, o intervalo de caracteres de aaté ze ].

Portanto, seu complemento é o conjunto de caracteres que inclui todos os caracteres [, mas o intervalo de caracteres de aaté ze ].

É por isso que [e ]não são substituídos.

Para substituir qualquer caractere não alfabético, basta especificar a-zA-Zcomo complemento do conjunto a ser substituído:

echo '[[:lower:]]' | tr -c 'a-zA-Z' '\n'
% echo '[[:lower:]]' | tr -c 'a-zA-Z' '\n'



lower



%

informação relacionada