in reply to Re: boundary reg expression
in thread boundary reg expression

Thanks all, So If I need to replace OLD with NEW then I do this?
s/OLD\b/NEW/g;
All my replacements words with OLD are capitalized and the new word is capitalized.

Replies are listed 'Best First'.
Re: Re: Re: boundary reg expression
by allolex (Curate) on Jul 21, 2003 at 15:01 UTC

    Well, sort of ;) Take these examples:

    s/\bold\b/new/gi; # 1: replaces all instances of the string, e.g. "old", # "OLD", "Old", "OlD" on either side with "new". s/\bold\b/new/g; # 2: replaces "old" with "new" -- case sensitive here. s/\bOLD\b/NEW/g; # 3: replaces "OLD" with "NEW" s/\bOLD\b/NEW/gi; # 4: replaces same variants of "OLD" as in 1 with "NEW"

    So, to finally answer your question: yes, but I think you might need that other "\b".

    Something that might help you a lot, as it did for me, is YAPE::Regex and YAPE::Regex::Explain by our very own japhy. They can be downloaded off the CPAN. For example:

    #!/usr/bin/perl use YAPE::Regex::Explain; print YAPE::Regex::Explain->new(qr/\bold\b/i)->explain;

    gives the following explanation.

    The regular expression: (?i-msx:\bold\b) matches as follows: NODE EXPLANATION ---------------------------------------------------------------------- (?i-msx: group, but do not capture (case-insensitive) (with ^ and $ matching normally) (with . not matching \n) (matching whitespace and # normally): ---------------------------------------------------------------------- \b the boundary between a word char (\w) and something that is not a word char ---------------------------------------------------------------------- old 'old' ---------------------------------------------------------------------- \b the boundary between a word char (\w) and something that is not a word char ---------------------------------------------------------------------- ) end of grouping ----------------------------------------------------------------------

    --
    Allolex

(jeffa) 3Re: boundary reg expression
by jeffa (Bishop) on Jul 21, 2003 at 15:06 UTC
    Add a boundary to the beginning and that should do the trick (watch out for words like FOLD, TOLD, etc). Also note that you don't need to write a full Perl script to make the changes to the files in question. You can do this with a one-liner:
    perl -pi -e's/\bOLD\b/NEW/g' *.txt
    And if you are paranoid and want to keep the orignals:
    perl -pi.bak -e's/\bOLD\b/NEW/g' *.txt
    will preserve them with a .bak "extension" added to the end of the filename. (For example, foo.txt becomes foo.txt.bak)

    jeffa

    L-LL-L--L-LL-L--L-LL-L--
    -R--R-RR-R--R-RR-R--R-RR
    B--B--B--B--B--B--B--B--
    H---H---H---H---H---H---
    (the triplet paradiddle with high-hat)