Filtrar cadeias com números em um intervalo e alterar o formato

0

Eu tenho um arquivo com linhas no seguinte padrão:

136x2340+1564+0

isto é, <N1>x<N2>+<N3>+<N4> .

Gostaria de filtrar (talvez com grep ) todas as linhas de tal forma que N1 intervalo seja de a a b e N2 intervalo seja de c para d .

As constantes a,b,c,d dependem do meu problema. Vou corrigi-los no script.

Eu tentei egrep '^([0-9][0-9][0-9]x[0-9][0-9][0-9]+)' , mas a saída mostra

136x2340+1564+0
835x428+355+1780
817x406+186+747
114x1533+1256+456

isto é, também mostra linhas com N2 com 4 dígitos (eu supus apenas 3 dígitos).

edit: também gostaria de substituir x por , (vírgula), o primeiro sinal + por (espaço vazio) e o segundo + assine por , (vírgula) para que a saída seja

N1,N2 N3,N4
    
por Sigur 29.11.2016 / 00:53

1 resposta

2

Na sintaxe da expressão regular estendida do grep (ERE), + é um quantificador que significa 'um ou mais do átomo precedente'. Para corresponder + literalmente neste contexto, você precisa escapar:

egrep '^([0-9][0-9][0-9]x[0-9][0-9][0-9]\+)' file
835x428+355+1780
817x406+186+747

Se você quiser fazer substituições , então grep não é a ferramenta certa - no entanto, se sua versão de sed tiver um modo regex estendido semelhante, você poderá usar:

sed -En 's/([0-9]{3})x([0-9]{3})\+([0-9]{1,})\+([0-9]{1,})/, ,/p' file
835,428 355,1780
817,406 186,747

Se você tiver apenas expressões regulares básicas, o escape se tornará mais difícil de ler:

sed -n 's/\([0-9]\{3\}\)x\([0-9]\{3\}\)+\([0-9]\{1,\}\)+\([0-9]\{1,\}\)/, ,/p' file
835,428 355,1780
817,406 186,747
    
por 29.11.2016 / 00:59