É possível usar a variável no comando sed no script unix bash [duplicado]

0

Estou tentando resolver o problema a seguir. Com grande ajuda dos outros aqui, eu posso escrever e entender simples loop no bash scripting.

Agora eu tento fazer isso:

No diretório "mein_directory", preciso seguir primeiro para

crie let digamos 10 subdiretórios, com subdiretórios de nome1 .... subdiretórios10

então eu preciso copiar o arquivo para cada subdiretório,

e, em seguida, preciso entrar em cada subdiretório e alterar uma palavra específica no arquivo que foi copiado do diretório principal.

E este é o meu principal problema no momento, porque eu preciso mudar a palavra específica é na verdade um número e eu preciso alterar esse número de um incremento multivariavelmente pelo número de subdiretório

para que meu código seja assim:

#!/bin/bash
increment=10

for i in {1..10}; do
    mkdir subdirectory_$i;
done


for d in */; do
    cp FILE "$d";
done

for j in {1..10}; do
    cd subdirectory_$j/
    increment=increment*$j
    sed -i 's/old_word old_digit/old_word old_digits+increment/g' CONTROL
    cd ../;
done

Então, digamos que o arquivo "FILE" esteja no subdiretório_1

Eu preciso mudar depois

de

Paul 10 a Paul 20

E no subdiretório_2

de

Paul 10 a Paul 30

Por que alguém sabe como contornar isso?

Muito obrigado

    
por Pavol Namer 10.01.2015 / 02:19

1 resposta

2

Digamos que o marcador old_word seja conhecido. Podemos então usar grep para obter o número do arquivo original:

NUM=$(grep -Po -m1 '(?<=old_word )\d+'  FILE)
  • Isso usa expressões regulares Perl. Ele diz que old_world deve preceder alguns dígitos, mas não deve ser considerado parte da correspondência real.
  • -o -m1 diz ao grep para imprimir apenas a seção correspondente (o número) e apenas a primeira correspondência.

Depois, você pode combinar sua cópia com a modificação:

for i in {1..10}
do 
    NEXT_NUM=$((NUM + i*increment))
    mkdir subdirectory_$i
    sed -r 's/(old_word )'$NUM'/'$NEXT_NUM'/' FILE > subdirectory_$i/FILE
done

Coisas a considerar:

  • sed não é muito bom em aritmética, portanto, se você quiser fazê-lo dentro da própria expressão, considere usar Perl ou Awk.
  • Você não pode fazer diretamente a=1*2 em scripts de shell para executar aritmética. Você precisa colocar a expressão em $(( )) : a=$((1*2)) ou usar palavras-chave como let .
  • As variáveis não são expandidas entre aspas simples, mas as expressões regulares geralmente contêm caracteres que têm um significado especial, por isso é mais seguro usar aspas simples para a expressão e deixá-las temporariamente para adicionar em nossa variável.
  • Os parênteses em torno de (old_word ) marcam isso como uma subexpressão, que você pode consultar depois usando (como pode ser visto na substituição).
por muru 10.01.2015 / 03:07