2008-12-12 7 views
3

J'ai essayé d'enlever le texte avant et après un caractère particulier dans chaque ligne d'un texte. Ce serait très difficile à faire manuellement car il contient 5000 lignes et j'ai besoin de supprimer le texte avant ce mot-clé dans chaque ligne. Tout logiciel qui pourrait le faire, serait génial ou tout script Perl qui pourrait fonctionner sur Windows. J'exécute des scripts Perl dans ActivePerl, donc des scripts qui pourraient le faire et fonctionner sur ActivePerl seraient utiles.Comment puis-je supprimer le texte avant et après un caractère particulier?

Merci

+0

Est-il possible pour vous donner un exemple d'une ligne d'entrée et la ligne de sortie vous en veux-tu? Votre question est un peu ambiguë, et les réponses que vous avez obtenues jusqu'ici en témoignent. –

Répondre

2

Vous n'avez pas besoin d'un logiciel, vous pouvez faire cette partie de votre script existant. Multiligne regex remplacez le long des lignes de/a (b) c/alors vous pouvez backref b dans le remplaçant avec $ 1. Sans en savoir plus sur le texte avec lequel vous travaillez, il est difficile de deviner quel serait le modèle.

1

Je dirais que si le texte $ contient votre texte entier, vous pouvez faire:

$text =~ s/^.*(keyword1|keyword2).*$/$1/m; 

Le modificateur m fait ^ et $ voir un début et une fin de ligne, et non le début et fin de la chaîne.

+0

Je pense que celui-ci ne fonctionnera pas, parce que le '. * $' Ne correspondra pas aux nouvelles lignes. –

+0

Bien sûr, cela ne correspondra pas aux nouvelles lignes, c'est le point de '/ m', n'est-ce pas ce qui a été demandé? – mat

+0

.correspondra à tout sauf à une nouvelle ligne. $ va correspondre après un retour à la ligne ou à la fin d'une chaîne. S'il y a une nouvelle ligne entre eux (comme ce sera généralement le cas), cela ne correspondra pas. –

2

présumant que vous avez les éléments suivants:

text1 text2 mot-clé text3 text4 text5 mot-clé text6 text7

et ce que vous voulez est

s/.*?keyword(.*?)keyword.*/keyword$1keyword/; 

sinon vous pouvez simplement remplacer le ligne entière avec mot-clé

Un examen ple des données peut nous aider à être plus clair

3

j'utiliser ceci:

$text =~ s/ .*? (keyword) .* /$1/gx; 
0

En supposant que vous souhaitez supprimer tout le texte à gauche de keyword1 et tout le texte à droite de keyword2:

while (<>) { 
    s/.*(keyword1)/$1/; 
    s/(keyword2).*/$1/; 
    print; 
} 

Placez ceci dans un script Perl et exécuter comme ceci:

fix.pl original.txt > new.txt 

Ou si vous voulez juste faire inplace, peut-être sur plusieurs fichiers à la fois:

perl -i.bak -pe 's/.*(keyword1)/$1/; s/(keyword2).*/$1/;' original.txt original2.txt 

Cela fera inplace éditer, renommer l'original d'avoir une extension .bak, utilisez un while implicite en boucle avec impression et exécuter la rechercher et remplacer le motif avant chaque impression.

Pour être sûr, vérifiez sans l'option -i premier, ou à tout le moins sur un seul fichier ...

Questions connexes