use strict; use warnings; while () { chomp; next if ! length; my ($section, $device, $culprit, $rev) = m/(\S+)\s+ ([^:]+):\s+ ((?:(?!\s*\(rev).)+)\s* (.*)/x; next if ! defined $rev; print "$section, $device, $culprit, $rev\n"; } __DATA__ 00:1f.3 SMBus: Intel Corporation 82801BA/BAM SMBus (rev 12) 00:1f.4 USB Controller: Intel Corporation 82801BA/BAM USB (Hub #2) (rev 12) 00:1f.5 Multimedia audio controller: Intel Corporation 82801BA/BAM AC'97 Audio (rev 12)