2009-09-09 10 views
0

Je dispose d'un fichier comme ceci:Comment puis-je supprimer tous les caractères autres que les mots, sauf le saut de ligne?

my line - some words & text 
oh lóok i've got some characters 

Je veux « normaliser » et supprimer tous les caractères non-mot. Je veux finir avec quelque chose comme ceci:

mylinesomewordstext 
ohlóokivegotsomecharacters 

J'utilise Linux sur la ligne de commande pour le moment, et j'espère qu'il ya une seule ligne que je peux utiliser.

J'ai essayé:

cat file | perl -pe 's/\W//' 

Mais qui a supprimé toutes les nouvelles lignes et tout mettre une ligne. Y a-t-il un moyen de dire à Perl de ne pas inclure de nouvelles lignes dans le \W? Ou y a-t-il un autre moyen?

Répondre

7

Cela supprime les caractères qui ne correspondent pas \w ou \n:

cat file | perl -C -pe 's/[^\w\n]//g' 
+0

Ceci supprime le o accentué dans le texte original. –

+0

Vous devrez ajouter un drapeau à la commande pour l'obtenir Unicode conscient -C devrait le faire. http://perldoc.perl.org/perlrun.html#Command-Switches –

+0

Droit, changé cela. – sth

1

La réponse précédente n'est pas écho le caractère « ó ». Au moins dans mon cas.

sed 's/\W//g' file 
+1

utilisation inutile du chat – camh

+0

vrai. Je l'ai vu trop tard =/ – dcruz

+1

hésitez pas à éditer votre réponse alors. – Ether

4

@ solution de STH utilise Perl, qui est (au moins sur mon système) non compatible Unicode, donc il perd le caractère o accentué.

D'autre part, sedest Unicode compatible (selon the lists on this page), et donne un résultat correct:

$ sed 's/\W//g' a.txt 
mylinesomewordstext 
ohlóokivegotsomecharacters 
1

Les meilleures pratiques pour les scripts shell dictent que vous devez utiliser le programme tr pour le remplacement simple caractères au lieu de sed, parce que c'est plus rapide et plus efficace. Évidemment, utilisez sed si vous remplacez des cordes plus longues.

tr -d '[: blank:] [: punct:]' fichier <

Effectué avec le temps que je reçois:

0m0.003s réel
utilisateur 0M0 .000s
sys 0m0.004s

Quand je lance la réponse sed (sed -e 's/\ W // g' fichier) avec le temps que je reçois:

0m0.003s réel
utilisateur 0m0.004s
sys 0m0.004s

Bien que pas un " énorme "différence, vous remarquerez la différence lors de l'exécution contre des ensembles de données plus volumineux. Notez également que je n'ai pas redirigé la sortie de cat vers tr, mais plutôt la redirection d'E/S (un processus de moins pour générer).

2

En Perl, je voudrais simplement ajouter l'option -l, qui re-ajoute la nouvelle ligne en l'ajoutant à la fin de chaque impression():

perl -ple 's/\W//g' file 

Notez que vous n'avez pas besoin cat.

Questions connexes