Inserir novo texto no meio de um arquivo substituindo texto antigo sem reinserir as mesmas coisas repetidas vezes?

0

Eu tenho um arquivo que desejo atualizar com relativa frequência. O que precisa ser feito é que uma parte específica do arquivo seja alterada para incluir mais algumas linhas. Estou fazendo isso com sed e \a option:
Então, isso funciona:

sed -i "/import:/a\$IMPORTED" file  

Isso funciona como esperado pela primeira vez. Nas próximas execuções, esses comandos são adicionados repetidamente nas mesmas linhas.
Como eu abordaria isso para que de alguma forma eu removesse tudo que importei antes de executá-lo novamente?
Por exemplo. usar algumas linhas a seguir para ancorar no começo que eu sei que não foram adicionadas automaticamente ou algo assim?

    
por Jim 27.11.2018 / 21:39

1 resposta

0

Seu comando:

sed "/import:/a\$IMPORTED" infile

Está inserindo o texto literal $IMPORTED no linux e no GNU sed. O problema é que o shell está interpretando a barra invertida antes do $ . Você pode citar corretamente:

sed '/import:/a\'"$IMPORTED" infile

Ou divida o valor em sua própria parte do script:

sed -e '/import:/a\' -e "$IMPORTED" infile

É sempre melhor criar scripts com aspas simples.

Para substituir um valor old por new , que pode conter um número indefinido de linhas, é necessário

  • Primeiro: capture todas as linhas no espaço padrão:

    sed 'H; 1h; $! d; x' infil

  • Defina valores para alterar:

    old = 'original' new = 'newvalue'

  • Remover o valor antigo (que deve existir):

    sed -E -e 'H; 1h; $! d; x' -e 's / (import:) (\ n)' "$ old" '/ \ 1 / g' infil

  • Adicione a nova entrada:

    sed -E -e 'H; 1h; $! d; x' -e 's / (import:) (\ n)' "$ old" '/ \ 1 / g' -e 's / ( import:) / \ 1 \ n '"$ new"' / g 'infil

Há um problema de canto em que, se a variável $old contiver um valor nulo (vazio), uma nova linha será removida. Para resolver isso, precisamos:

sed -E -e 'H;1h;$!d;x' -e 's/(import:)'"${old:+"(\n)$old"}"'//g' -e 's/(import:)/\n'"$new"'/g' infile
    
por 28.11.2018 / 10:50