How to preserve backslashes when using sed command
Today I faced an interesting task. I wanted to generate a bunch of yaml files with different names to test some payloads. Each time I generated a yaml file, I needed to uploaded the file to the system manually, check the result and then move to the next generated file.
So this is the yaml template:
metadata:
name: replaceme
...omitted...And the file with payloads, say:
\x3C
\u003c
...omitted...The first thought is to use sed to replace the replaceme string with the payload. So potential script would look like so:
for line in $(cat payloads.txt); do
echo "> "$line
sed "s/replaceme/$line/" yaml_template.yaml > final_yaml.yaml
read -p "Press any key to continue..."
doneThe problem with the script is that sed considers backslashes (\) as an escape symbol, so the resulting yaml for the first payload will look like
metadata:
name: x3c
...omitted...Solution
What would be the solution in this case? We can use the printf command to workaround this situation:
for line in $(cat payloads.txt); do
echo "> "$line
sed "s/replaceme/$(printf %q "$line")/" yaml_template.yaml > final_yaml.yaml
read -p "Press any key to continue..."
donewhich will produce the correct yaml:
metadata:
name: \x3c
...omitted...
Member discussion