So, I was editing a markdown file in Vim and I wanted to convert some lines to links. The regexp pattern ended up needing non-greedy quantifier, but it didn't work. I thought I got Vim's rather weird \{-} syntax wrong and switched to using Perl from the command line instead of checking the documentation if I had actually made that mistake.

Turns out I made other mistakes in the regexp, but I didn't want to switch back to Vim. I was still scratching my head though, since I wasn't getting the expected output. Thankfully, compared to the previous debug misery, I was able to guess this issue soon enough.

Here's a simplified issue, how I debugged it and the corrected usage:

# sample input $ cat ip.txt  * blah blah 12 xyz 34 abcd 56 foobaz - blah 100 apple 200 fig  # where I got stuck # what happened to $1 and $2? $ perl -lpe 's/^(. )(.*?\d+) (.+)/$1[$2](#$3)/' ip.txt (#xyz 34 abcd 56 foobaz) (#apple 200 fig)  # what I did to debug # step 1: only $1 in the replacement $ perl -lpe 's/^(. )(.*?\d+) (.+)/$1/' ip.txt *  -  # step 2: $1 and $2 in the replacement # only empty lines as output - bingo! $ perl -lpe 's/^(. )(.*?\d+) (.+)/$1[$2]/' ip.txt   # $1[$2] treated as array syntax in Perl # so, need to escape [ since array isn't intended here $ perl -lpe 's/^(. )(.*?\d+) (.+)/$1\[$2](#$3)/' ip.txt * [blah blah 12](#xyz 34 abcd 56 foobaz) - [blah 100](#apple 200 fig)