Search code examples
regexperlmultilinecommand-line-tool

How can I match multi-line patterns in the command line with perl-style regex?


I regularly use regex to transform text.

To transform, giant text files from the command line, perl lets me do this:

perl -pe < in.txt > out.txt

But this is inherently on a line-by-line basis. Occasionally, I want to match on multi-line things.

How can I do this in the command-line?


Solution

  • To slurp a file instead of doing line by line processing, use the -0777 switch:

    perl -0777 -pe 's/.../.../g' in.txt > out.txt
    

    As documented in perlrun #Command Switches:

    The special value -00 will cause Perl to slurp files in paragraph mode. Any value -0400 or above will cause Perl to slurp files whole, but by convention the value -0777 is the one normally used for this purpose.

    Obviously, for large files this may not work well, in which case you'll need to code some type of buffer to do this replacement. We can't advise any better though without real information about your intent.