BASH: Single-quotes inside of single-quoted strings | Comments (12)
Posted in Code, Linux/Unix on 30th January 2007, 11:38 pm by Stuart
Using single quotes in BASH ensures that the shell doesn’t expand the contents of the quoted string and this is useful most of the time. However if you want to use single quotes within a single quoted string things don’t work out as you might expect.
For example using the following simple PHP snippet:
<?php
echo '<p>this is a string</p>';
?>
If I want to use sed to match some text with a single quotes in it, I will run into trouble if I run:
sed -e s/'<p>/'<p class="test">/g
This will output:
/bin/bash: line 1: p: No such file or directory
This is because the unquoted string will be expanded and BASH will think that < is a redirection.
Alternatively if I run (on the same snippet):
sed -e 's/\'<p>/\'<p class="test">/g'
I will get:
/bin/bash: -c: line 1: unexpected EOF while looking for matching `''
/bin/bash: -c: line 2: syntax error: unexpected end of file
This doesn’t work because the escaped single-quotes (\') are not expanded and are therefore treated literally.
To single quotes work you need to break out of the single quoted string then escape your single quote. Like so:
sed -e 's/'\''<p>/'\''<p class="test">/g'
Because \' is not inside of single quotes the single-quote is properly escaped and the output is as we’d expect:
<?php
echo '<p class="test">this is a string</p>';
?>
In conclusion, the title of this post is a bit of a misnomer. You actually can’t put single quotes inside of a single-quoted string. However breaking out allows us to get to where we want to be.

Thanks for the tip! It worked pefectly!
You can also use ANSI C style quoting. This is not documented in bash’s man page, annoyingly.
$ echo $'foo\'bar'foo'barIt is documented in my version of the man page, dated 2002 July 15, in the section called QUOTING:
Words of the form
$'string'are treated specially…\'single quoteBingo! It works! Thanks.
I needed it to use awk inside an alias.
Worked perfectly! Digging it!
So if you have a string that you’re cleaning up, say in python:
str.replace(“‘”,”‘\\””)
first ‘ – end single quoted string
\\ – literal backslash
‘ – single quote to be backslashed
‘ – resume single quoted string
Thanks!
thanks. also for bash alias. \’ didn’t work for me. suspect specialized parse around $x variables.
Thanks so much for posting this easy to understand solution
Wow! This is exactly the problem I had, and a perfect solution. Great post!
[...] helpful instructions on Stuart Colville’s blog explain how to do [...]
This was exactly what I needed to get my script working the way I expected. Many thanks!
mm22
Thanks, i used it for generating a web page where i had problems with enclosed “”” part. It is also a logic “rule” so, easy to remember