tenho um arquivo assim
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 fique assim
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+)\)/\1/g'
Além disso, como posso me livrar de tudo dentro dos parênteses, incluindo os parênteses, para obter a seguinte saída também
x + chrX 15362 15364 + 100 * * * 100 * 100
y + chrX 153626 153626 + 100 98.56 100 100 100 4
Tente isto:
sed -r 's/[^[:blank:]]*\(([[:digit:]]+)\)/\1/g'
\d
é uma construção PCRE, não de regex estendidaCanalize a saída
| column -t
para a beleza.Aqui, usamos
sed
para remover qualquer parêntese na entrada. A expressão([^)]*)
corresponde a um parêntese esquerdo seguido por qualquer número de caracteres que não sejam parênteses à direita (ou seja, o número), seguido por um parêntese direito. Você também pode usar([0-9]*)
aqui.Aqui, excluímos o bit antes do parêntese e os próprios parênteses, e substituímos tudo isso pelo que estava dentro do parêntese. O material antes de
(
é correspondido por[^[:blank:]]*
, ou seja, qualquer número de caracteres não em branco, seguido pela mesma expressão do primeirosed
comando, mas capturando o conteúdo entre(
e)
. A string capturada é referenciada na parte de substituição do comando por\1
.Seu comando,
não funciona corretamente porque
\d
é uma PCRE (uma expressão regular do tipo Perl). Substituir\d
por[0-9]
ou[[:digit:]]
não faria com que funcionasse melhor, pois substituiria toda a linha pelo número dentro do último parêntese.