Home > other >  sed command with dynamic variable and spaces - not retaining spaces
sed command with dynamic variable and spaces - not retaining spaces

Time:06-25

I am trying to insert a variable value into file from Jenkinsfile using shell script in the section Variable value is dynamic. I am using sed.

Sed is working fine but it is not retaining the white spaces that the variable have at the beginning.

ex: The value of >> repoName is " somename"

stage('trying sed command') {
      steps {
        script {
          sh """
          #!/bin/bash -xel
          repo='${repoName}'
          echo "\$repo"
          `sed -i "5i \$repo" filename`
          cat ecr.tf
          """
        }
      }
    }

current output:

names [
   "xyz",
   "ABC",
somename
   "text"
 ]

Expected output:

names [
   "xyz",
   "ABC",
   somename
   "text"
 ]

How do i retain the spaces infront of the variable passing from sed

CodePudding user response:

With

$ cat filename
names [
   "xyz",
   "ABC",
   "text"
 ]

$ repo=somename

we can do:

sed -E "3s/^([[:blank:]]*).*/&\\n\\1${repo},/" filename
names [
   "xyz",
   "ABC",
   somename,
   "text"
 ]

That uses capturing parentheses to grab the indentation from the previous line.


if $repo might contain a value with slashes, you can tell the shell to escape them with this (eye-opening) expansion

repo='some/name'
sed -E "3s/^([[:blank:]]*).*/&\\n\\1${repo//\//\\\/},/" filename
names [
   "xyz",
   "ABC",
   some/name,
   "text"
 ]

CodePudding user response:

The i command skips over spaces after the i command to find the text to insert. You can put the text on a new line, with a backslash before the newline, to have the initial whitespace preserved.

stage('trying sed command') {
      steps {
        script {
          sh """
          #!/bin/bash -xel
          repo='${repoName}'
          echo "\$repo"
          `sed -i "5i \\\\\\
\$repo" filename`
          cat ecr.tf
          """
        }
      }
    }

I've tested this from a regular shell command line, I hope it will also work in the Jenkins recipe.

  • Related