2009-11-21 3 views
0

Je voudrais utiliser ceci:Comment puis-je ajouter des caractères au début et à la fin de chaque ligne non vide dans Perl?

perl -pi -e 's/^(.*)$/\"$1\",/g' /path/to/your/file 

pour ajouter « au début de la ligne et », à la fin de chaque ligne dans un fichier texte. Le problème est que certaines lignes ne sont que des lignes vides et je ne veux pas qu'elles soient modifiées. Des idées comment modifier le code ci-dessus ou peut-être le faire complètement différemment?

Répondre

9

D'autres ont déjà répondu à la question de syntaxe regex, regardons ce style. Cette regex souffre du "syndrome du cure-dent penchée" où /// fait saigner le cerveau.

s{^ (.+) $}{ "$1", }x; 

Utilisation des délimiteurs équilibrés, le modificateur/x pour les choses espacer et l'élimination des backwhacks inutiles rend beaucoup plus facile de lire l'expression rationnelle. De plus, le/g est inutile car cette regex ne correspondra qu'une seule fois par ligne.

+0

qui le rend beaucoup plus lisible, merci! – Phil

7
perl -pi -e 's/^(.+)$/\"$1\",/g' /your/file 

. * Correspond à 0 ou plusieurs caractères; . + correspond à 1 ou plus.

Vous pouvez également remplacer le .+ par .*\S.* pour vous assurer que seules les lignes contenant un caractère non-espace sont indiquées.

4

changement. * À. +

En d'autres lignes de mots doit contenir à 1 ou plusieurs caractères. . * représente zéro ou plusieurs caractères.

4

Vous devriez être en mesure de remplacer tout le * (0 ou plus) avec un + (1 ou plus), comme ceci:

perl -pi -e 's/^(.+)$/\"$1\",/g' /path/to/your/file 
3
sed -r 's/(.+)/"\1"/' /path/to/your/file 
4

tout ce que vous faites est d'ajouter quelque chose à l'avant et l'arrière de la ligne, donc il n'y a pas besoin de regex. Juste les imprimer. Regex pour une telle tâche est chère si votre fichier est grand.

gawk

$ awk 'NF{print "\042" $0 "\042,"}' file 

ou Perl

$ perl -ne 'chomp;print "\042$_\042,\n" if ($_ ne "") ' file 
+0

Cela ne modifie-t-il pas aussi les lignes vides? Il a dit qu'il ne voulait pas ça. –

+0

facile à réparer. done – ghostdog74

+0

Juste pour être pédant, dans la version Perl, vous voulez 'if $ _ ne ''' plutôt que simplement 'if $ _'. '$ _' sera évalué comme faux pour certaines lignes non vides (en particulier celles contenant un seul 0). –

Questions connexes