Home > OS >  How do I keep my escaped double quotes when using sed in bash
How do I keep my escaped double quotes when using sed in bash

Time:12-13

I'm trying to do a replace where I first escape all double quotes and then I want to use the result of this replace to updated a value. But in the last replace the backslashes are removed, why is this and how do I avoid that?

Example in bash:

>TEST_OBJECT='{"val1": "a", "val2": "b"}'

>ESCAPED_OBJ="$(echo $TEST_OBJECT | sed 's/"/\\"/g')"

>echo $ESCAPED_OBJ
{\"val1\": \"a\", \"val2\": \"b\"}

>echo 'value: "_REPLACE_ME"' | sed "s@_REPLACE_ME@$ESCAPED_OBJ@g"
value: "{"val1": "a", "val2": "b"}"

I'm expecting this on the last row:

value: "{\"val1\": \"a\", \"val2\": \"b\"}"

EDIT

I realize I presented the issue wrong, the reason why I do it in 2 steps is because the first replace happens in one step and then the second replace happens in a later step. This is part of a github workflow and the last replace actually replaces a string in a different yaml file.

sed "s@_REPLACE_ME@$ESCAPED_OBJ@g" > ${{ github.action_path }}/config/job.yml

So I don't think I can do the replace in one step, first I need to update the string and then replace a value in another file.

job.yml

...
env:
  - name: CUSTOM_DATA_OBJECT
    value: "_REPLACE_ME"

I need the value to be escaped so that it doesn't break the yaml.

CodePudding user response:

Using sed

$ sed "s@_REPLACE_ME@${TEST_OBJECT//\"/\\\\\"}@" input_file
...
env:
  - name: CUSTOM_DATA_OBJECT
    value: "{\"val1\": \"a\", \"val2\": \"b\"}"

CodePudding user response:

Maybe letting yq take care of the correct escaping for YAML?

TEST_OBJECT='{"val1": "a", "val2": "b"}' \
    yq eval '.env[0].value = strenv(TEST_OBJECT)' file.yaml
env:
  - name: CUSTOM_DATA_OBJECT
    value: "{\"val1\": \"a\", \"val2\": \"b\"}"
  • Related