2010-09-24 20 views
7

Digamos que " archivo de texto" contiene lo siguiente:Bash: archivo de texto Dividir en palabras con caracteres no alfanuméricos como delimitadores

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

y que desea imprimir cada palabra en una línea separada. Sin embargo,, las palabras se deben definir no solo por espacios, sino por todos los caracteres no alfanuméricos. Por lo que los resultados deben ser:

lorem 
ipsum 
is9simply 
the 
dummy 
text 
of 
printing 

¿Cómo puedo lograr esto mediante el intérprete de comandos?



Algunas notas:

  • Esto no es una cuestión tareas.

  • El caso más simple cuando las palabras deben determinarse solo por espacios, es fácil. Sólo escribir:

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

    hará el truco, y regreso:

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

    Para la división de palabras por caracteres no alfanuméricos que he visto soluciones que utilizan el IFS variable ambiental (enlaces siguientes), pero me gustaría evitar el uso de IFS por dos razones: 1) requeriría (creo) establecer el IFS en una larga lista de caracteres no alfanuméricos. 2) Me parece feo.

  • Éstos son los dos Q relacionada & Como ya he encontrado
    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?

Respuesta

17

Utilice el comando tr:

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

El '-c' es para el complemento de los caracteres especificados; el '-s' exprime los duplicados de los reemplazos; el 'a-zA-Z0-9' es el conjunto de caracteres alfanuméricos (¿también puede agregar _?); el '\ n' es el personaje de reemplazo (nueva línea). También es posible usar una clase de caracteres, que es sensible al entorno local (y puede incluir más caracteres que la lista anterior):

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

perfecto, esto es exactamente lo que estaba buscando. ¡Gracias! (Lo siento, no tengo la reputación suficiente para votar su respuesta) – Sv1

+1

@ Sv1: Probablemente tenga una gran reputación pronto. Voté tu pregunta por lo bien que documentabas lo que querías y por toda la investigación que hiciste al respecto. – grok12

+0

¿Qué pasa si tienes números decimales? – 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

gracias Ross! esto es muy bueno, he tenido la intención de entrar en el awk-universe :) – Sv1

Cuestiones relacionadas