capturando usando sed

0

Eu tenho um arquivo como este

x   +   chrX    15362   15364   +   100(3)  *(0)    *(0)    *(0)    100(5)  *(0)    100(1)
y   +   chrX    153626  153626  +   100(80) 98.56(79)   100(40) 100(47) 100(88) 4(23)

Eu quero capturar os valores entre parênteses e apenas imprimi-los para que a saída pareça com isso

x   +   chrX    15362   15364   +   3   0   0   0   5   0   1
y   +   chrX    153626  153626  +   80  79  40  47  88  23

Eu quero fazer isso no sed.

Eu tentei algo assim, mas não está funcionando

sed -r 's/^.*\((\d+)\)//g'

Além disso, como posso me livrar de tudo dentro dos parênteses, incluindo os parênteses, para que eu obtenha a seguinte saída também

x   +   chrX    15362   15364   +   100 *   *   *   100 *   100
y   +   chrX    153626  153626  +   100 98.56   100 100 100 4
    
por user3138373 06.09.2018 / 18:44

2 respostas

1
$ sed 's/([^)]*)//g' file
x   +   chrX    15362   15364   +   100  *    *    *    100  *    100
y   +   chrX    153626  153626  +   100 98.56   100 100 100 4

Aqui, usamos sed para remover qualquer parêntese na entrada. A expressão ([^)]*) corresponde a um parêntese à esquerda seguido por qualquer número de caracteres parênteses não à direita (ou seja, o número), seguido por um parêntese à direita. Você também pode usar ([0-9]*) aqui.

$ sed 's/[^[:blank:]]*(\([^)]*\))//g' file
x   +   chrX    15362   15364   +   3  0    0    0    5  0    1
y   +   chrX    153626  153626  +   80 79   40 47 88 23

Aqui, excluímos o bit antes dos parênteses e dos parênteses, e substituímos tudo isso pela coisa que estava dentro dos parênteses. O material antes do ( ser correspondido por [^[:blank:]]* , ou seja, qualquer número de caracteres não em branco, seguido pela mesma expressão do primeiro comando sed , mas capturando o conteúdo entre ( e ) . A string capturada é referenciada na parte de substituição do comando por .

Seu comando,

sed -r 's/^.*\((\d+)\)//g'

não funciona corretamente porque \d é uma PCRE (uma expressão regular semelhante a Perl). A substituição de \d por [0-9] ou [[:digit:]] não faria com que funcionasse melhor, pois substituiria a linha inteira pelo número dentro do último parêntese.

    
por 06.09.2018 / 18:53
1

Tente isto: sed -r 's/[^[:blank:]]*\(([[:digit:]]+)\)//g'

  • localiza zero ou mais caracteres não brancos seguido de parentesco aberto seguido por dígitos (captura) seguidos por parentes próximos
  • substitua apenas pelos dígitos capturados
  • faça isso globalmente na linha
  • \d é uma construção PCRE, não de regex estendida

Canalize a saída em | column -t para a beleza.

    
por 06.09.2018 / 18:51

Tags