Home > Software design >  Sed capture group
Sed capture group

Time:03-12

I have a problem with sed unable to correctly capture the \1 capture group in the below example:

echo '//apple' | sed "s/^\(\/\)\{0,2\}apple\(\/\)\?/\1banana\2/"
                         -------------              --
                            ^                        ^
                            |                        |__ writing back what it captured
                            |
                            |_ this is the capture group that I have problem capturing

I expected the output of: //banana correctly capturing the //. How can I make sed to correctly the \1 capture group?

CodePudding user response:

You only captured one /.

You need to use

echo '//apple' | sed 's/^\(\/\{0,2\}\)apple\(\/\)\?/\1banana\2/' # POSIX BRE
echo '//apple' | sed -E 's~^(/{0,2})apple(/)?~\1banana\2~'       # POSIX ERE variant

See the enter image description here

CodePudding user response:

With an alternate delimiter and -E use cleaner and easier to read:

echo '//apple' | sed -E 's~^(/{0,2})apple(/{0,2})~\1banana\2~'
  • Related