in reply to Re: This regular expression has me stumped
in thread This regular expression has me stumped

I was hung up on regexp because I want this via a command line perl -nei.bak..... I checked my log files /blah/blah/blah/filename can be follows by a whitespace, a "@' q "," or a ":" I have searched for perl non greedy and I suspect
/.*?[@:,\s+]/
will actually match the whole <code>/blah/blah/blah/filename.ext>/code> the problem here is, how to retain the filename...?

Replies are listed 'Best First'.
Re^3: This regular expression has me stumped
by tachyon-II (Chaplain) on May 01, 2008 at 09:52 UTC

    You almost never want .* A negated character class is generally better. For example m!/[(^/)]+$! will grab the last bit of the filepath reliably but the regex posted above in the map should DWIM

    You could certainly code the example above as a one liner but it seems a waste of time to me. You can make a reusable 4 line script in less time than it will take fiddling. You can put options like -p -F -n on the shebang. As a one liner it would be like:

    perl -F -ane 'print map{"$_\n"} map{ } grep { } @F' <file>

    where the map and grep blocks are as above.

Re^3: This regular expression has me stumped
by goibhniu (Hermit) on May 01, 2008 at 15:24 UTC

    Picking up with the theme you were following, I got this to work. I haven't thought alot about corner cases, performance or reusability, so Grandfather's and tachyon-II's solutions are probably better.

    update: apparently I'm just confused on this matter && added comment on second s/// with no effect: I didn't like doing the substitution twice just to get the end-of-line anchor to work. Perhaps some wiser monks can explain that to me. update: That was before I added chomp, so never mind . . .

    #/usr/bin/perl -W $\="\n"; use strict; use warnings; while (<DATA>) { chomp; print $_; s/\/(?:[^\@:,\s+]*\/)(.*?)[\@:,\s+]*/\/new\/path\/$1/g; #s/\/(?:[^\@:,\s+]*\/)(.*?)[\@:,\s+]*$/\/new\/path\/$1/g; print $_; print ''; } # produces: # C:\chas_sandbox> # 683879resp.pl # file /user/name/some/path/to/filename@@ dumped: replaced /user/name/ +blah/blah/filename # file /new/path/filename@@ dumped: replaced /new/path/filename # # @@@@user/some/file/filename.sdc: dumped # @@@@user/new/path/filename.sdc: dumped __DATA__ file /user/name/some/path/to/filename@@ dumped: replaced /user/name/bl +ah/blah/filename @@@@user/some/file/filename.sdc: dumped


    #my sig used to say 'I humbly seek wisdom. '. Now it says:
    use strict;
    use warnings;
    I humbly seek wisdom.