c:\@Work\Perl\monks>perl -wMstrict -le "my @lines = ( 'some text foo | some text BAR | oh , no , commas | some text BAZ | some text QUX', 'some text Oof | some, text, BAR | some , text , BAZ | some text QUX', 'some, text, FOO | some text BAR | one two | some , text , QUX', ); ;; my $got_commas = qr{ (?: (?<= [|]) | \A) [^|,]* (?: , [^|,]*)+ (?= [|] | \z) }xms; ;; for my $line (@lines) { while ($line =~ m{ ($got_commas) }xmsg) { my $before = substr $line, 0, $-[1]; my $after = substr $line, $+[1]; print qq{:$before$_$after:} for split m{ , }xms, $1; } } " :some text foo | some text BAR | oh | some text BAZ | some text QUX: :some text foo | some text BAR | no | some text BAZ | some text QUX: :some text foo | some text BAR | commas | some text BAZ | some text QUX: :some text Oof | some| some , text , BAZ | some text QUX: :some text Oof | text| some , text , BAZ | some text QUX: :some text Oof | BAR | some , text , BAZ | some text QUX: :some text Oof | some, text, BAR | some | some text QUX: :some text Oof | some, text, BAR | text | some text QUX: :some text Oof | some, text, BAR | BAZ | some text QUX: :some| some text BAR | one two | some , text , QUX: : text| some text BAR | one two | some , text , QUX: : FOO | some text BAR | one two | some , text , QUX: :some, text, FOO | some text BAR | one two | some : :some, text, FOO | some text BAR | one two | text : :some, text, FOO | some text BAR | one two | QUX: