replace a string by variable in a file using bash script

10,330

Solution 1

AWK can search and replace text as well, so there is no need to use grep or sed. The code bellow extracts substring from second column (webN), increments N, and substitutes second field with webN+1

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

This will print edited file on screen. You can save that to another file like so awk [rest of code here] > fileName.txt and replace original with new using mv fileName.txt oldFile.txt

Solution 2

Using Perl:

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

To edit the file in place, add the -i option:

perl -i -pe 's/\bweb\K[0-9]+\b/$&+1/ge' file
  • -p: causes Perl to assume the following loop around your program, which makes it iterate over filename arguments somewhat like sed:

       LINE:
         while (<>) {
             ...             # your program goes here
         } continue {
             print or die "-p destination: $!\n";
         }
    
  • -e: may be used to enter one line of program.
  • s/\bweb\K[0-9]+\b/$&+1/ge: matches any web string preceded by a word boundary, discards the match and matches one or more digits followed by a word boundary, replacing the match with the equivalent number increased by 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

Solution 3

Thanks guys, I tried this code and that worked fine for me,

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

Related videos on Youtube

Adam
Author by

Adam

Updated on September 18, 2022

Comments

  • Adam
    Adam over 1 year

    through bash script, I am trying to find a value-number- from a text in a file, then make a new variable then replace it with a string in that file for example. in a file in /root/test.txt , i have a string web1 i need to cut the number "1", and increase it by 1 so it will be 2 then replace web1 by web2 that is what i did so far any idea how to make it works ?

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

    Sample input:

     project web0
    

    Sample output:

     project web1
    
    • kos
      kos about 8 years
      Please post a sample input and a sample output.
    • Adam
      Adam about 8 years
      Input In second line in the file test.txt project web0 output: project web1
    • kos
      kos about 8 years
      We'll need to take a look at the input file in order to be able to tell you how to extract the information you want; also personally I'm not really understanding how the output should look like, so an example would help.
    • steeldriver
      steeldriver about 8 years
      The most fundamental issue with your approach so far is that shell variables are not expanded when inside single quotes. However you could do it much cleaner in perl since it can handle arithmetic expressions right in the replacement pattern.
    • kos
      kos about 8 years
      I didn't notice you edit to your comment. I've added the sample input and sample output you provided to the question. That is easily doable with Perl, but does any instance of webN have to be replaced with webN+1 or are there other constraints?
    • Adam
      Adam about 8 years
      Yes exactly, I need the script to find the string "webN" in a file and replace it by "webN+1" everytime i run the script
    • Sergiy Kolodyazhnyy
      Sergiy Kolodyazhnyy about 8 years
      This could be done with AWK alone, no need for other scripts. Are webN parts always on the second column ?
    • Adam
      Adam about 8 years
      yes it is in the second line, second word !
  • Sergiy Kolodyazhnyy
    Sergiy Kolodyazhnyy about 8 years
    Beaten me by a minute :p +1