torr / - \ ([0-9.] \ + \) / (\ 1) / g 'inputfile o que este comando significa? [fechadas]

2

Estou tentando descobrir o que o comando a seguir significa:

sed 's/-\([0-9.]\+\)/()/g' inputfile

Eu sei que tem a ver com caracteres não dígitos.

    
por juju 25.09.2018 / 20:42

2 respostas

12

No GNU sed, ele procura por um traço seguido por alguns dígitos ou pontos e substitui os mesmos dígitos entre parênteses. Ou seja, ele transforma -123.45 em (123.45) .

Em alguns outros sed s, como o baseado no BSD no macOS, ele procura por um traço, um dígito ou um ponto e um sinal de mais literal e, em seguida, remove o traço e circunda o restante entre parênteses. Ou seja, ele transforma -1+ em (1+) , mas deixa coisas como -123 como está.

A diferença é porque \+ não tem um significado padrão em expressões regulares básicas. O GNU o interpreta como o mesmo que + em expressões regulares estendidas, ou seja, "uma ou mais das anteriores", enquanto outras consideram literal + .

Quanto às outras partes no padrão à esquerda, o traço coincide, [0-9.] corresponde a qualquer dígito ou ponto e o \( .. \) captura a parte intermediária. Na substituição, os parênteses são literais e retorna o que estava dentro de \( .. \) .

Mais portably, isso deve ser

  • no RE estendido, supondo que seu sed suporta -E , o que muitos fazem:

    sed -E 's/-([0-9.]+)/()/' 
    
  • no RE básico:

    sed 's/-\([0-9.]\{1,\}\)/()/' 
    

Ambos devem substituir um traço na frente de um número entre parênteses ao redor dele.

    
por 25.09.2018 / 20:58
2

Parece que a alteração do formato de números negativos tem um - na frente deles para estar entre parênteses.

Ele procura por uma sequência que comece com - seguida por uma sequência de numerais e decimais [0-9.] correspondendo a numerais e decimais e \+ modificando-a para corresponder a um ou mais caracteres em uma sequência. A seqüência de numerais e decimais está dentro de \(...\) , que é a primeira expressão, e na cláusula de substituição, () irá colar a primeira expressão entre () . O resultado final é a remoção de um sinal negativo na frente de um número e o quebra entre parênteses.

Então, com uma entrada de:

test value: -123.4

a saída deve estar no formato

test value: (123.4)
    
por 25.09.2018 / 20:47

Tags