como modificar correspondências para uma expressão regular com sed ou outra ferramenta?

1

Eu preciso manipular o texto que está em um arquivo. Eu preciso acrescentar um parêntese direito - ) - depois de cada número que é precedido por uma vírgula - , - por exemplo,

  • ,4,4)
  • ,15,15)

Estou com dificuldades para encontrar a maneira correta de fazer isso com sed . Eu tentei o seguinte, que funciona para 1 dígito, mas não parece ser estendido para 2 dígitos (por isso é bom para a primeira linha acima, mas não o segundo):

sudo sed 's/,\([0-9]\)/,)/g' filename

Então tentei o seguinte para 2 dígitos:

sudo sed 's/,\([0-9]([0-9]?\)/,)/g' filename

Isso não fez nada - o arquivo permaneceu inalterado, embora eu não tenha recebido uma mensagem de erro. Qual é a maneira correta de procurar um dígito obrigatório e um segundo dígito opcional e, em seguida, movê-los para o texto de substituição? Eu ainda preciso fazer isso:

  • ,15,15)

Qualquer conselho seria muito apreciado.

    
por Beeb 06.03.2015 / 19:18

1 resposta

1

Você estava quase lá, tente isto:

sudo sed 's/,\([0-9]\{1,2\}\)/,\)/g' filename

Aqui, além do seu comando, acabei de adicionar \{1,2\} , que corresponde ao regex anterior, entre uma a duas vezes, ou seja, de um mínimo de uma vez até um máximo de duas vezes.

\([0-9]\{1,2\}\) explicado:

  • [0-9] corresponderá a um único dígito entre 0 e 9
  • {1,2} corresponderá à regex anterior de um a um máximo de duas vezes. Então, um jogo é obrigatório e o segundo é opcional (como você quiser)
  • () fará um grupo regex para que possamos consultá-lo mais tarde.
  • Observe também que usamos '\' na frente de toda a sintaxe de regex estendida para que eles não sejam tratados literalmente. Poderíamos ter usado a opção -r (regex estendido) com gnu sed , nesse caso poderíamos escrever:

    sudo sed -r 's/,([0-9]{1,2})/,\)/g' filename
    

EDITAR : Se você quiser combinar qualquer número de dígitos (mínimo um) depois da vírgula, você pode fazer:

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

ou mais simplesmente:

sudo sed 's/,\([0-9]\+\)/,\)/g' filename
    
por 06.03.2015 / 19:27