2012-11-26 7 views
0

J'ai du mal à insérer une nouvelle ligne avant une chaîne assortie qui consiste en une période suivie de 2 ou 3 caractères (alphanumériques) et se terminant par une autre période. Si possible, cela doit être une seule instruction qui agit sur un fichier entier.Perl regex pour insérer globalement newline avant le match pattern

Quelque chose comme (?):

$contents =~ s/\.{2,3}\./\n\.<what goes here?>\./g; 

Plus précisément, je traite un fichier de nombreux enregistrements de catalogue dans un processus en 2 étapes. Étape 1: suppression de tous les retours chariot du fichier. Étape 2: recherche de chaînes de texte telles que .AUTH. et .RE. et même .856. et faire de chacun d'eux le début d'une nouvelle ligne. Je peux le faire avec une longue série de substitutions spécifiques,

$contents=~s/\.RE\./\n\.RE\./g; 
$contents=~s/\.AUTH\./\n\.AUTH\./g; 
$contents=~s/\.TITL\./\n\.TITL\./g; 

Mais je crois comprendre que je peux aussi le faire plus efficacement avec une seule instruction (en utilisant regex variables intégrées?)

Merci,

Thom

+2

Les caractères '.' ne doivent pas être échappé dans les chaînes de remplacement. –

Répondre

-1
$contents =~ s/(\.\w{2,3}\.)/\n$1/; 

Utilisez des parenthèses pour se rappeler la chaîne correspondant et 1 $ pour y faire référence dans la partie de substitution.

+1

La solution fait ce que vous avez demandé: "insérer une nouvelle ligne avant une chaîne assortie qui consiste en une période suivie de 2 ou 3 caractères (alphanumériques) et se terminant par une autre période", donc je ne comprends pas le vote négatif. Si vous préférez d'autres solutions, c'est bien, mais au moins ne votez pas négativement quelque chose qui fonctionne. –

1

Pour supprimer tous les caractères de nouvelle ligne utilisent

$contents =~ s/\n//g; 

Pour ajouter des caractères désirés nouvelle ligne, utilisez

$contents =~ s/(?=[.][a-z\d]{2,3}[.])/\n/ig; 
+0

Cela a bien fonctionné pour les chiffres, mais n'a rien fait pour les lettres. En d'autres termes, le .856. les chaînes ont été précédées d'une nouvelle ligne, pas, disons, le .AUTH. lignes. –

+0

@ThomasShepard - Bien sûr, cela ne fonctionne pas avec '.AUTH.', car on vous a demandé 2-3 caractères alphanumériques et' AUTH' 4 caractères. Des maths simples, non? Alors, qui a tort? Si vous devez aller jusqu'à 4 caractères, alors changez {2,3} '' {2,4} 'et vous devriez être bon pour aller ... –

+1

Gee, mon visage est rouge! Bien sûr, vous avez raison, et oui, cela fonctionne maintenant. Merci beaucoup! –