Home > Software design >  Regex does not match in Perl, while it does in other programs
Regex does not match in Perl, while it does in other programs

Time:03-21

I have the following string:

load Add 20 percent
 to accommodate

I want to get to:

load Add 20 percent to accommodate

With, e.g., regex in sublime, this is easily done by: Regex: ([a-z])\n\s([a-z]) Replace: $1 $2

However, in Perl, if I input this command, (adapted to test if I can match the pattern in any case):

perl -pi.orig -e 's/[a-z]\n. to/TEST/g' file

It doesn't match anything.

Does anyone know why Perl would be different in this case, and what the correct formulation of the Perl command should be?

CodePudding user response:

By default, Perl -p flag read input lines one by one. You can't thus expect your regex to match anything after \n.

Instead, you want to read the whole input at once. You can do this by using the flag -0777 (this is documented in perlrun):

perl -0777 -pi.orig -e 's/([a-z])\n\s(to)/$1 $2/' file

CodePudding user response:

Just trying to help and reminding below your initial proposal for perl regex:

perl -pi.orig -e 's/[a-z]\n. to/TEST/g' file

Note that in perl regex, [a-z] will match only one character, NOT including any whitespace. Then as a start please include a repetition specifier and include capability to also 'eat' whitespaces. Also to keep the recognized (but 'eaten') 'to' in the replacement, you must put it again in the replacement string, like finally in the below example perl program:

$str = "load Add 20 percent
 to accommodate";

print "before:\n$str\n";

$str =~ s/([ a-z] )\n\s*to/\1 to/;

print "after:\n$str\n";

This program produces the below input:

before:
load Add 20 percent
 to accommodate
after:
load Add 20 percent to accommodate

Then it looks like that if I understood well what you want to do, your regexp should better look like:

s/([ a-z] )\n\s*to/\1 to/ (please note the leading whitespace before 'a-z').

  • Related