'How to replace a hashtag curly bracket string with an environment variable by using sed

I have being trying to write a bash script that can search recursively in a directory and replace multiple strings e.g. #{DEMO_STRING_1} etc with an environment variable e.g. $sample1.

Full script:

#!/bin/sh

find /my/path/here -type f -name '*.js' -exec sed -i \
    -e 's/#{DEMO_STRING_1}/'"$sample1"'/g' \
    -e 's/#{DEMO_STRING_2}/'"$sample2"'/g' \
    -e 's/#{DEMO_STRING_3}/'"$sample3"'/g' \
    -e 's/#{DEMO_STRING_4}/'"$sample4"'/g' \
    -e 's/#{DEMO_STRING_5}/'"$sample5"'/g' \
    -e 's/#{DEMO_STRING_6}/'"$sample6"'/g' \
    -e 's/#{DEMO_STRING_7}/'"$sample7"'/g' \
    -e 's/#{DEMO_STRING_8}/'"$sample8"'/g' \
    {} +

I can not figure out how to replace strings with hashtag with curly brackets.

I tried this example: sed find and replace with curly braces or Environment variable substitution in sed but I can not figure out how to combine them.

What I am missing? I searched also for characters that need to be escaped e.g. What characters do I need to escape when using sed in a sh script? but again not the characters that I need.

The specific format is throwing the following error:

sed: bad option in substitution expression

Where am I going so wrong?

Update: Sample of environment variables:

  1. https://www.example.com
  2. /sample string/
  3. 12345-abcd-54321-efgh
  4. base64 string

All the cases above are environment variables that I would like to replace. All environment variables are within double quotes.



Solution 1:[1]

If you use perl - you don't need to escape anything.

With your shell variable exported you can access it via $ENV{name} inside perl.

examples:

samples=(
    https://www.example.com
    '/sample string/'
    12345-abcd-54321-efgh
    'base64 string'
    $'multi\nline'
)

for sample in "${samples[@]}"
do
    echo '---'
    export sample
    echo 'A B #{DEMO_STRING_1} C' |
        perl -pe 's/#{DEMO_STRING_1}/$ENV{sample}/g'
done
echo '---'

Output:

---
A B https://www.example.com C
---
A B /sample string/ C
---
A B 12345-abcd-54321-efgh C
---
A B base64 string C
---
A B multi
line C
---

To add the -i option you can: perl -pi -e 's///'

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1