sed:! p comando comportamento estranho

3

Por que o seguinte comando imprime valores numéricos?

$ iostat | sed -n '/[:digit:]/!p'

       1.56    1.38    0.31    0.34    0.03   96.38
    
por sci9 13.03.2018 / 10:01

1 resposta

10

A classe de caracteres POSIX que você está tentando usar deve ser colocada dentro de uma expressão de colchete regular, portanto [[:digit:]] not [:digit:] . Você também não está limitado a usar apenas a classe de um caractere na expressão de colchetes, por exemplo, [[:digit:][:punct:]] ou [^[:digit:]] pode ser usado.

Seu comando realmente significa "imprimir todas as linhas que não correspondem a nenhum dos caracteres : , d , i , g ou t :

$ printf 'a\nd\ni\n:\n'
a
d
i
:
$ printf 'a\nd\ni\n:\n' | sed -n '/[:digit:]/!p'
a

O que você queria era:

$ iostat | sed -n '/[[:digit:]]/!p'

avg-cpu:  %user   %nice %system %iowait  %steal   %idle

Device:            tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn

Note que as novas versões do GNU sed (v.4.4 neste exemplo) imprimirão um aviso:

$ iostat | sed -n '/[:digit:]/!p'
sed: character class syntax is [[:space:]], not [:space:]
    
por 13.03.2018 / 10:09