C'est cool, ça me fait un prétexte pour me documenter sur les one-liners, aspect de Perl que je n'avais que survolé.
Avant d'entrer dans le vif du sujet, quelques remarques sur tes commandes :
Tout d'abord, tu peux te passer de la commande cat, et mettre directement ton nom de fichier en argument de la commande perl :
perl -ne '$i++; next unless m:.<mesdata:; print "$i : $_";' monfichier.xml | less
Ensuite, tu n'as pas besoin de $i++ pour afficher tes numéros de lignes, il existe une variable spéciale pour ça(*) : $.
perl -ne 'print "$. : $_" if (m:.<mesdata:)' monfichier.xml | less
Bon, maintenant, ce que l'on veut, c'est afficher tout sauf les lignes comportant cette erreur :
perl -ne 'print unless (m:.<mesdata:)' monfichier.xml | less
J'ai pris la liberté d'enlever l'affichage des numéros de lignes, vu que c'est moins pertinent ici. Du coup, le print n'affichant plus que $_, qui est la variable par défaut, je rends cette dernière implicite en ne donnant pas d'argument à print.
Mais le but ultime c'est quand même de modifier le fichier. Eh bien, pour ça, il y a l'option -i, qui remplace le contenu du fichier par la sortie de la commande. Elle a, de plus, l'aspect très pratique de pouvoir prendre un argument alphanumérique quelconque qu'elle va utiliser comme extension pour faire un backup.
perl -iWAHAAAGH838 -ne 'print unless (m:.<mesdata:)' monfichier.xml
Ce qui nous donne le fichier monfichier.xml modifié comme tu le souhaites, et un fichier monfichier.xmlWAHAAAGH838 qui est une copie du fichier avant modification. Bon, d'accord, généralement on n'utilise pas un truc comme "WAHAAAGH838" comme extension, mais plutôt des trucs comme ".old" ou ".bak". C'était juste un exemple.
(*) Soit dit en passant, en Perl, si on peut se dire "tiens, ça serait vachement utile dans plein de situations" (ici, un moyen simple d'afficher le numéro de ligne) on peut être à peu près sûr que ça existe déjà, particulièrement si ça concerne du texte.
Partager