Bash: Replace single quote by two quotes in string

bashescape-characters

I have a variable, e.g. a'b, containing a single quote which I need to replace by two single quotes before writing it to a file: a''b.

The following bash code used to get the job done for me …

line="a'b"
echo "${line//\'/\'\'}" > out.txt

… until today when I discovered diverging outputs depending on the version of bash being used:

  • GNU bash, version 4.3.48(1)-release (x86_64-pc-linux-gnu): a''b
  • GNU bash, version 4.2.46(2)-release (x86_64-redhat-linux-gnu): a\'\'b

I tried to modify the line above in numerous ways but was unable to have it produce the same output a''b in both bash shells.

I ended up using a combination of echo and sed instead,

echo "$(echo $line | sed "s/'/''/g")" > out.txt

but I am still wondering if the job can be gotten done with a more concise pure bash expression. Can it?

Best Answer

One of the changes between bash-4.3-alpha, and the previous version, bash-4.2-release:

When using the pattern substitution word expansion, bash now runs the replacement string through quote removal, since it allows quotes in that string to act as escape characters. This is not backwards compatible, so it can be disabled by setting the bash compatibility mode to 4.2.


Input:

BASH_COMPAT=4.2
line="a'b"
echo "${line//\'/''}"

Output:

a''b
Related Question