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

2

Escrevendo 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), o tr deve substituir todos os caracteres que não estão no SET1 pelo caractere especificado em SET2. No entanto, não funciona como esperado ... Tente isto:

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

Saída eu recebo:

[[
lower
]]

Como pode ser visto, ele substitui as colunas, mas não os colchetes, que deve substituir.

Alguém pode esclarecer isso?

    
por vanjadjurdjevic 02.11.2015 / 19:16

1 resposta

3

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



%
    
por 02.11.2015 / 19:30