substitua uma string por variável em um arquivo usando o script bash

3

por meio do script bash, estou tentando encontrar um valor numérico de um texto em um arquivo, em seguida, criar uma nova variável e substituí-la por uma string nesse arquivo por exemplo. em um arquivo em /root/test.txt, eu tenho uma string web1 eu preciso cortar o número "1", e aumentá-lo por 1, então será 2 em seguida, substitua web1 por web2 é isso que eu fiz até agora alguma ideia de como fazer isso funcionar?

#!/bin/bash
m=grep 'web' /root/test.txt | awk '{print }'
i= $m | cut -c3
i=i+1
n='web$i'
$ sed -i 's/$m/$n/g' /root/test.txt

Exemplo de entrada:

 project web0

Exemplo de saída:

 project web1
    
por Adam 13.02.2016 / 17:18

3 respostas

3

O AWK também pode pesquisar e substituir texto, portanto, não é necessário usar grep ou sed . O código abaixo extrai a substring da segunda coluna ( webN ), incrementa N e substitui o segundo campo por webN+1

$ cat testInput.txt                                                                                          
project web0
other
project web1
$ awk '/web/{ num=substr(,4)+1;="web"num };1' testInput.txt                                              
project web1
other
project web2

Isto irá imprimir o arquivo editado na tela. Você pode salvar isso em outro arquivo como awk [rest of code here] > fileName.txt e substituir original por novo usando mv fileName.txt oldFile.txt

    
por Sergiy Kolodyazhnyy 13.02.2016 / 17:51
3

Usando o Perl:

perl -pe 's/\bweb\K[0-9]+\b/$&+1/ge' file

Para editar o arquivo, adicione a opção -i :

perl -i -pe 's/\bweb\K[0-9]+\b/$&+1/ge' file
  • -p : faz com que o Perl assuma o seguinte loop em torno do seu programa, o que faz com que seja iterado sobre argumentos de nome de arquivo, da mesma forma que o sed:

       LINE:
         while (<>) {
             ...             # your program goes here
         } continue {
             print or die "-p destination: $!\n";
         }
    
  • -e : pode ser usado para inserir uma linha de programa.
  • s/\bweb\K[0-9]+\b/$&+1/ge : corresponde a qualquer string web precedida por um limite de palavra, descarta a correspondência e corresponde a um ou mais dígitos seguidos por um limite de palavra, substituindo a correspondência pelo número equivalente aumentado em 1.
% cat file
project web0
project web1
project web2
% perl -pe 's/\bweb\K[0-9]+\b/$&+1/ge' file
project web1
project web2
project web3
    
por kos 13.02.2016 / 17:48
1

Obrigado pessoal, eu tentei este código e isso funcionou bem para mim,

#!/bin/bash
DPATH="/root/test.txt"
k=$(grep 'web' $DPATH | awk '{print }')      # web ends by a number#
i=$(grep 'web' $DPATH | awk '{print }'| cut -c3)
m=$((i+1))
n="web$m"
sed -i -e 's/'"$k"'/'"$n"'/g' $DPATH
    
por Adam 14.02.2016 / 22:33