Bug 242013

Summary: sed(1): matching back references works only some of the time
Product: Base System Reporter: Keith Hellman <khellman>
Component: binAssignee: freebsd-bugs (Nobody) <bugs>
Status: New ---    
Severity: Affects Some People    
Priority: ---    
Version: 12.0-RELEASE   
Hardware: Any   
OS: Any   

Description Keith Hellman 2019-11-16 22:15:50 UTC
Matching back references according to re_format(7):
  
     Finally, there is one new type of atom,
     a back reference: ‘\’ followed by a non-zero decimal digit d matches the
     same sequence of characters matched by the dth parenthesized
     subexpression (numbering subexpressions by the positions of their opening
     parentheses, left to right), so that (e.g.)  ‘\([bc]\)\1’ matches ‘bb’ or
     ‘cc’ but not ‘bc’.

does not always seem to work.  For instance, I would expect all of these 
to print the single input line:

$ echo '#20#20' | sed -n -E -e '/(#|0x)(..)\1\2/p'
$ echo '#2020#' | sed -n -E -e '/(#|0x)(..)\2\1/p'
$ echo '#202020' | sed -n -E -e '/(#|0x)(..)20\2/p'
#202020
$ echo '#202020' | sed -n -E -e '/(#|0x)(..)\2(20)/p'
$ echo '#202020' | sed -n -E -e '/(#|0x)(..)(20)\2/p'
#202020
$ echo '#202020' | sed -n -E -e '/(#|0x)(..)..\2/p'
#202020
$ echo '#20#20' | sed -n -E -e '/(#|0x)(..).\2/p'
#20#20

Additionally, gsed(1) equivalent invocations work as expected.