Cyker
Cyker

Reputation: 10914

substitute single quotes in sed and perl

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

Answers (1)

Shawn
Shawn

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

Related Questions