Reputation: 10914
Could someone please explain what was happening with these two commands? Why do sed
and perl
give different results running the same regular expression pattern:
# echo "'" | sed -e "s/\'/\'/"
''
# echo "'" | perl -pe "s/\'/\'/"
'
# sed --version
sed (GNU sed) 4.5
Upvotes: 3
Views: 1563
Reputation: 52344
You're using GNU sed, right? \'
is an extension that acts as an anchor for end-of-string in GNU's implementation of basic regular expressions. So you're seeing two quotes in the output because the s
matches the end of the line and adds a quote, after the one that was already in the line.
To make it a bit more obvious:
echo foo | sed -e "s/\'/@/"
produces
foo@
Documented here, and in the GNU sed manual
Edit: The equivalent in perl is \Z
(or maybe \z
depending on how you want to handle a trailing newline). Since \'
isn't a special sequence in perl regular expressions, it just matches a literal quote. As mentioned in the other answer and comments, escaping a single quote inside a double quoted string isn't necessary, and as you've found, can potentially result in unintended behavior.
Upvotes: 8