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) #### 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)