Duas perguntas sobre o comando * nix tr

2

Eu tenho duas perguntas sobre o comando tr do shell do Linux, ① é:

$ echo 'abcd123' | tr -c 'a-z' '0-9'

o resultado é: 'abcd9999'. Tem 4 '9's, por quê? E por que é 9, não um dos '0-8'? ② é:

$ echo hello 1 char 2 next 4 | tr -d -c '0-9 \n'

o resultado é; '1 2 4', alguém pode explicar isso para mim? como é executado?

    
por user2331313 24.08.2013 / 09:14

2 respostas

3

A primeira pergunta:

echo 'abcd123' na verdade imprime 'abcd123\n' para stdout. E para tr -c 'a-z' '0-9' , a opção -c significa que o complemento de 'a-z' será usado para a tradução, consulte man page de tr .

Há muito mais caractere excluindo 'a-z' correspondente a '0-9', portanto, o caractere restante de 'abcd123\n' , excluindo caractere minúsculo, que é '123\n' , será traduzido como '9999' . Então, o resultado é 'abcd9999', com o trailing '\ n'.

A segunda pergunta é muito simples:

echo hello 1 char 2 next 4 print hello 1 char 2 next 4\n para stdout. O 'tr -d -c '0-9 \n'' exclui todos os complementos de '0-9' number e space character e '\ n'.

É por isso que o caractere restante contém números e espaços e, a propósito, um caractere '\ n'.

    
por 24.08.2013 / 09:39
2

Em relação ao comando:

echo 'abcd123' | tr -c 'a-z' '0-9'

A página de manual para tr diz:

tr [OPTION]... SET1 [SET2]

... SET2 is extended to length of SET1 by repeating its last character as necessary ...

O complemento de 'a-z' é todos os caracteres, exceto as letras minúsculas. Portanto, esse conjunto é um pouco mais longo do que os dez caracteres em '0-9', e os dígitos da string "abcd123" correspondem ao último caractere repetido, '9'.

Em:

echo hello 1 char 2 next 4 | tr -d -c '0-9 \n'

você está dizendo a tr para deletar qualquer coisa que não esteja no conjunto de caracteres que você deu como SET1. Por isso, exclui todos os caracteres, exceto os dígitos, espaço e nova linha. Não tenho certeza do que mais você poderia estar esperando aqui.

    
por 24.08.2013 / 09:37

Tags