Bash - Substituindo o número aleatório entre aspas

2

Eu criei um script que grava arquivos .flame / XML-like, contendo dentro deles, uma string que se parece com:

scale="n"

onde n é um número aleatório, com um número variável de dígitos. O que estou tentando fazer é substituir essa string por outro número aleatório dentro de um determinado intervalo; gerar esse número é trivial, já que eu tenho shuf trabalhando para esse propósito. O problema surge quando tentamos localizar e substituir essa string, pois ela pode ser semelhante a qualquer um dos seguintes:

scale="54.1948", scale="182.55816", or scale="3.59"

Eu tentei usar sed para isso, e embora esteja confiante de que é possível, não encontrei a sintaxe correta. A ocorrência dessa string não é consistente entre os arquivos.

O ideal é que o comando que estou procurando converta uma string como esta:

scale="54.1948" or scale="3.59"

para um que se pareça com:

scale"254" or scale="579"

Obrigado por qualquer ajuda.

    
por Bluethulhu 04.01.2017 / 12:49

2 respostas

3

A sintaxe que você está procurando é sed -e 's/\(scale=\)"[0-9]\+\(\.[0-9]\+\)\?"/"'"$replacement_number"'"/' . A regex de pesquisa em detalhes:

\(scale=\)        the literal string scale=, remembered as 
"                 opening double quote
[0-9]\+           one or more digits
\(\.[0-9]\+\)\?   optionally, a period followed by one or more digits
"                 closing double quote
    
por 04.01.2017 / 13:01
0

Esta é uma solução mais simples e mais generalizada. Sintaxe de sed estendida ( -e ) e referências anteriores não são usadas para esta solução.

Isso substitui tudo entre aspas duplas com o número $n .

O comando básico sed tem esta aparência:

s/scale="[^"]*"/scale="$n"/

A expressão [^"]* corresponde a zero ou mais caracteres sem aspas duplas. Depois de citar, o comando shell se parece com isto:

sed "s/scale=\"[^\"]*\"/scale=\"$n\"/"

Se você quiser alterar apenas os valores de scale que contêm apenas números e pontos decimais, use algo assim:

s/scale="[.0-9]*"/scale="'$n"/

Geralmente, há uma troca entre a verificação de entrada versus a legibilidade e a facilidade de manutenção.

    
por 04.01.2017 / 17:27