La règle d'or des expressions régulières est "moins, c'est plus". Vous devez toujours essayer d'écrire la plus simple des expressions régulières correspondant à vos données. Non seulement elle est beaucoup plus facile à lire et à comprendre, mais elle est aussi beaucoup plus robuste et ne se cassera pas avec de petits changements de format. Donc, dans votre cas, vous pourriez simplement faire :
$ sed -r 's/(.*), ([^,]+,[^,]+,[^,]*$)/\2\1/' file
Friday, Mar 13,2015 16:59:42blah, blah, blah,
Friday, Mar 13,2015 16:51:11yadi, yadi, yada,
Cela correspond à tout ce qui se trouve depuis le début de la ligne jusqu'à une virgule et un espace ( (.*),
) et, parce que le motif est entouré de parenthèses, il l'enregistre sous le nom de \1
. Maintenant, parce que le deuxième groupe capturé (deuxième motif entre parenthèses) va jusqu'à la fin de la ligne (c'est ce que fait le $
signifie), on sait que l'on fait correspondre la bonne partie dans la première.
La seconde recherche un tronçon d'un ou plusieurs caractères non-comma ( [^,]+
), une virgule, une autre série de non-comma, une autre virgule et ensuite autant de caractères non-comma que possible jusqu'à la fin de la ligne. De cette façon, nous pouvons identifier correctement les derniers champs comme étant la date. Le site s///
est l'opérateur de substitution qui, ici, change simplement l'ordre du premier et du deuxième motif capturé.
Vous pouvez également faire la même chose dans awk
. On peut supposer que le texte précédant la date est variable et que nous ne pouvons pas supposer le même nombre de champs pour chaque ligne. Par conséquent, nous devrons compter les champs à rebours à partir de la fin de la ligne :
$ awk -F, '{
printf "%s,%s,%s, ", $(NF-2),$(NF-1),$NF;
for(i=1;i<NF-3;i++){printf "%s,", $i} print $(NF-3)
}' file
Friday, Mar 13,2015 16:59:42, blah, blah, blah
Friday, Mar 13,2015 16:51:11, yadi, yadi, yada
Ou en Perl :
$ perl -lpe 's/(.*), ([^,]+,[^,]+,[^,]*$)/\2, \1/' file
Friday, Mar 13,2015 16:59:42, blah, blah, blah
Friday, Mar 13,2015 16:51:11, yadi, yadi, yada
$ perl -F, -lane 'print join ",",@F[$#F-2,$#F-1,$#F,0..$#F-3]' file
Friday, Mar 13,2015 16:59:42,blah, blah, blah
Friday, Mar 13,2015 16:51:11,yadi, yadi, yada