Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Vim regex to substitute/escape pipe characters

Tags:

regex

vim

Let's suppose I have a line:

a|b|c

I'd like to run a regex to convert it to:

a\|b\|c

In most regex engines I'm familiar with, something like s%\|%\\|%g should work. If I try this in Vim, I get:

\|a\||\|b\||\|c

As it turns out, I discovered the answer while typing up this question. I'll submit it with my solution, anyway, as I was a bit surprised a search didn't turn up any duplicates.

like image 472
rutter Avatar asked Sep 18 '13 20:09

rutter


3 Answers

vim has its own regex syntax. There is a comparison with PCRE in vim help doc (see :help perl-patterns).

except for that, vim has no magic/magic/very magic mode. :h magic to check the table.

by default, vim has magic mode. if you want to make the :s command in your question work, just active the very magic:

:s/\v\|/\\|/g
like image 136
Kent Avatar answered Nov 16 '22 20:11

Kent


Vim does the opposite of PCRE in this regard: | is a literal pipe character, with \| serving as the alternation operator. I couldn't find an appropriate escape sequence because the pipe character does not need to be escaped.

The following command works for the line in my example:

:. s%|%\\|%g
like image 28
rutter Avatar answered Nov 16 '22 18:11

rutter


If you use very-magic (use \v) you'll have the Perl/pcre behaviour on most special characters (excl. the vim specifics):

:s#\v\|#\\|#g
like image 3
sehe Avatar answered Nov 16 '22 18:11

sehe