Public Scratchpad | Download, Select Code To D/L |
------
23 Feb 2013
I've got a file with a bunch of lines that look like so:
Honda CB1000 1995 26 47 15 99-3520-5 30 55 17 99-3519-5
and some lines that look like:
Yamaha YZF-R1 Limited edition 2006 30 47 12 99-3540-5 30 55 17 99-3519-5
I'm trying to grab everything up to and including the year.
Thus far I have
cat triple_swap_bearings.txt | perl -ne 's/(^[^\s]*\s*[^\s]*\s*[\w\d\ +]*?(?=\d\d\d\d\s*\d\d\s*\d\d)\s*\d\d\d\d)\s*\d\d\s*\d\d.*$/\1/; print +;'
which fails on the lines that have the "extra stuff" after the model name, and before the year.
I suppose I don't need the [^\s]*\s*[^\s]*\s* though I was working on the "say what you really really mean in regex" principle there.
What I need to say in regex is "Match things which are not four digits followed by some amount of whitespace followed by two more digits".
Answer:
cat triple_swap_bearings.txt | perl -ne 's/(^[^\s]+\s*[^\s]+\s*[\w\d\ +\-\(\)\&\/]+?(?=\s+\d\d\d\d\s+\d\d\s+\d\d)\s+\d\d\d\d)\s+\d\d\s+\d\d. ++$/\1/; print;'
(Note the addition of \s+ inside the positive lookahead assertion.)
------
Date Unknown:
etc. vs:if ($foo == 1) { my $bar; unless(($bar = $socket->read()) =~ /one/) { die $bar, $!; } $socket->write('foo'); unless(($bar = $socket->read()) =~ /two/) { die $bar, $!; } $socket->write('bar');
if ($foo == 1) { unless((my $bar = $socket->read()) =~ /one/) { die $bar, $!; } $socket->write('foo'); unless((my $bar = $socket->read()) =~ /two/) { die $bar, $!; } $socket->write('bar');