I see now my problem statement was a little sloppy: I failed to use the same sample text in my first two examples. Namely, I inadvertently omitted the trailing comma in the first example.
And sure enough, the answer above (or rather, the three variations on the answer) works on the incorrect example, but still fails on the correct one.
$ echo ,abcdefg,abcdefg | perl -pe 's/,(?:.*?(cd))?.*?,/=$1=/'
=cd=abcdefg
$ echo ,abcdefg,abcdefg, | perl -pe 's/,(?:.*?(cd))?.*?,/=$1=/'
=cd=abcdefg,
works either way when the "cd" appears between the first two anchors, but if it doesn't:
$ echo ,abcefg,abcdefg | perl -pe 's/,(?:.*?(cd))?.*?,/=$1=/'
==abcdefg
$ echo ,abcefg,abcdefg, | perl -pe 's/,(?:.*?(cd))?.*?,/=$1=/'
=cd=
it gives me what I'm looking for only when the final "," is missing. With it, the expression goes back to running past the anchor and stealing from the next blob of text.
I need to study the answer below to see if it does what I need, but I had high hopes for the ones above, because I like their simplicity. :-) |