Regular Expression Help
Drew Tomlinson
drew at mykitchentable.net
Sun Nov 30 11:25:36 PST 2008
Matthew Seaman wrote:
> Drew Tomlinson wrote:
>> I'm attempting to take an ldiff file and flip first/last name order.
>> However I can not figure out how to match hyphenated last names. In
>> vim, my current search/replace string is:
>>
>> %s/cn=\(\w\+\-*\) \(\w\+\),/cn=\2 \1,/gc
>>
>> This will match:
>>
>> cn=Smith Joe,
>>
>> and replace it with:
>>
>> cn=Joe Smith,
>>
>> But it will not match:
>>
>> cn=Smith-Brown Joe,
>>
>> nor replace it with:
>>
>> cn=Joe Smith-Brown,
>>
>> I've tried various incantations of escaping and quantifying yet I can
>> not figure out how to do what I want.
>
> Well, assuming that none of the surnames contain ',' and that the
> first ' '
> (space) is always the delimiter between the surname and that anything
> else
> is forenames ...
> % cat foo.txt cn=Smith Joe,
> cn=Smith-Brown Joe,
> % perl -p -e 's/cn=([^ ,]+) ([^,]+),/cn=$2 $1,/' < foo.txt cn=Joe Smith,
> cn=Joe Smith-Brown,
>
> ie. you need a s/// command that understands negated character
> classes. I
> think sed(1) and vi(1) will do that, but I haven't time to look up the
> precise
> syntax. Perl, of course, just does the job for me.
Thank you for your reply. The particular editor I was attempting to use
is vim 7.1.315. However it doesn't like the above string so I tried you
perl example verbatim. It works and even handles such lines as:
cn=Smith-Brown Joe & Jane,
to
cn=Joe & Jane Smith-Brown,
which I hadn't considered.
I still don't really understand *why* the above works but I'm trying to
pick it apart now.
Thanks to you and the others for the replies.
Cheers,
Drew
--
Be a Great Magician!
Visit The Alchemist's Warehouse
http://www.alchemistswarehouse.com
More information about the freebsd-questions
mailing list