How do I reverse escape backslash encodings like "\ " and "\303\266" in bash? How do I reverse escape backslash encodings like "\ " and "\303\266" in bash? bash bash

How do I reverse escape backslash encodings like "\ " and "\303\266" in bash?


Here's a rough stab at the Unicode characters:

text="/My\ Folders/My\ r\303\266m/"text="echo \$\'"$(echo "$text"|sed -e 's|\\|\\\\|g')"\'"# the argument to the echo must not be quoted or escaped-quoted in the next steptext=$(eval "echo $(eval "$text")")read text < <(echo "$text")echo "$text"

This makes use of the $'string' quoting feature of Bash.

This outputs "/My Folders/My röm/".

As of Bash 4.4, it's as easy as:

text="/My Folders/My r\303\266m/"echo "${text@E}"

This uses a new feature of Bash called parameter transformation. The E operator causes the parameter to be treated as if its contents were inside $'string' in which backslash escaped sequences, in this case octal values, are evaluated.


It is not clear exactly what kind of escaping is being used. The octal character codes are C, but C does not escape space. The space escape is used in the shell, but it does not use octal character escapes.

Something close to C-style escaping can be undone using the command printf %b $escaped. (The documentation says that octal escapes start with \0, but that does not seem to be required by GNU printf.) Another answer mentions read for unescaping shell escapes, although if space is the only one that is not handled by printf %b then handling that case with sed would probably be better.


In the end I used something like this:

cat file | sed 's/%/%%/g' | while read -r line ; do printf "${line}\n" ; done | sed 's/\\ / /g'

Some of the files had % in them, which is a printf special character, so I had to 'double it up' so that it would be escaped and passed straight through. The -r in read stops read escaping the \'s however read doesn't turn "\ " into " ", so I needed the final sed.