2010-09-24 4 views
7

permet de dire « textfile » contient les éléments suivants:Bash: textfile Divisé en mots avec des caractères non alphanumériques comme délimiteurs

lorem$ipsum-is9simply the.dummy text%of-printing 

et que vous voulez imprimer chaque mot sur une ligne distincte. Cependant, les mots doivent être définis non seulement par des espaces, mais par tous les caractères non-alphanumériques. Ainsi, les résultats devraient ressembler à:

lorem 
ipsum 
is9simply 
the 
dummy 
text 
of 
printing 

Comment puis-je accomplir cela en utilisant le shell Bash?



Quelques notes:

  • Ce n'est pas une question de devoirs.

  • Le cas le plus simple où les mots ne doivent être déterminés que par des espaces est facile. en train d'écrire:

    for i in `cat textfile`; do echo $i; done; 
    

    fera l'affaire, et retour:

    lorem$ipsum-is9simply 
    the.dummy 
    text%of-printing 
    

    Pour les mots de division par des caractères non alphanumériques que j'ai vu des solutions qui utilisent la variable d'environnement IFS (liens ci-dessous), mais je voudrais éviter d'utiliser IFS pour deux raisons: 1) il faudrait (je pense) mettre l'IFS à une longue liste de caractères non alphanumériques. 2) Je trouve ça moche.

  • Voici les deux Questions et réponses sur & Comme je l'ai trouvé
    How do I split a string on a delimiter in Bash?
    How to split a line into words separated by one or more spaces in bash?

Répondre

17

Utilisez la commande tr:

tr -cs 'a-zA-Z0-9' '\n' <textfile 

Le '-c' est pour la compléter des caractères spécifiés; le '-s' supprime les doublons des remplacements; le 'a-zA-Z0-9' est l'ensemble des caractères alphanumériques (peut-être ajouter _ aussi?); le '\ n' est le caractère de remplacement (nouvelle ligne). Vous pouvez également utiliser une classe de caractères qui est sensible locale (et peut inclure plus de caractères que la liste ci-dessus):

tr -cs '[:alnum:]' '\n' <textfile 
+0

parfait, c'est exactement ce que je recherchais. Merci! (Je suis désolé, je n'ai pas assez de réputation pour voter pour votre réponse) – Sv1

+1

@ Sv1: Vous aurez probablement une grande réputation bientôt. J'ai voté votre question parce que vous avez bien documenté ce que vous vouliez et pour toutes les recherches que vous avez faites à ce sujet. – grok12

+0

Et si vous avez des nombres décimaux? – Leyu

3
$ awk -f splitter.awk < textfile 

$ cat splitter.awk 
{ 
    count0 = split($0, asplit, "[^a-zA-Z0-9]") 
    for(i = 1; i <= count0; ++i) { print asplit[i] } 
} 
+0

merci Ross! c'est plutôt cool, j'ai eu l'intention d'entrer dans l'univers awk :) – Sv1

Questions connexes