Tengo una cadena con el siguiente formato:

string1:string2:string3:string4:string5

Estoy tratando de utilizar sed para dividir la cadena en : y de impresión de cada una de las sub-cadena en una línea nueva. Aquí es lo que yo estoy haciendo:

cat ~/Desktop/myfile.txt | sed s/:/\\n/

Esto imprime:

string1
string2:string3:string4:string5

¿Cómo la puedo dividir en cada delimitador?

  • indicador global? /g?
  • Usted podría considerar la posibilidad de tr : '\n' <~/Desktop/myfile.txt. Desde sed puede abrir archivos bastante bien, no es necesario el uso de cat en el ejemplo de la pregunta.
InformationsquelleAutor hax0r_n_code | 2013-08-14

6 Comentarios

  1. 59

    Para dividir una cadena con un delimitador con GNU sed dices:

    sed 's/delimiter/\n/g'     # GNU sed

    Por ejemplo, para dividir el uso de : como un delimitador:

    $ sed 's/:/\n/g' <<< "he:llo:you"
    he
    llo
    you

    O con un no-GNU sed:

    $ sed $'s/:/\\n/g' <<< "he:llo:you"
    he
    llo
    you

    En este caso en particular, se olvidó de la g después de la sustitución. Por lo tanto, es hecho sólo una vez. Ver:

    $ echo "string1:string2:string3:string4:string5" | sed s/:/\n/g
    string1
    string2
    string3
    string4
    string5

    g significa global y significa que la sustitución tiene que ser hecho a nivel mundial, que es, para cualquier eventualidad. Ver que el valor por defecto es 1 y si pones por ejemplo 2, se realiza 2 veces, etc.

    Todos juntos, en su caso, usted tendría que usar:

    sed 's/:/\n/g' ~/Desktop/myfile.txt

    Tenga en cuenta que usted puede utilizar directamente la sed ... file sintaxis, en lugar de las tuberías: cat file | sed.

    • Maldita sea! Yo estaba tan cerca. ¿Qué hace el g hacer? Y voy a aceptar su respuesta tan pronto como puedo. Gracias!
    • Es sinónimo de global y significa que la sustitución tiene que ser hecho globally, esto es, para cualquier celebración. Ver que el valor por defecto es 1 y si pones por ejemplo 2, se realiza 2 veces, etc.
    • Esto no funciona en no-GNU sed. La canónica/portátil manera de hacer, de decir, de su último ejemplo sería sed $'s/:/\\\n/g' file.txt, confiando en bash formato citando a interpretar la norma ANSI notación de barra invertida.
    • gracias, he actualizado con este enfoque también. En el futuro, siéntase libre de actualización de puestos para hacerlos más correcta, todos aprendemos de ella!
  2. 27

    Utilizando \n en sed no es portátil. El portátil para hacer lo que quieras con sed es:

    sed 's/:/\
    /g' ~/Desktop/myfile.txt

    pero en realidad esto no es un trabajo para sed de todos modos, es el trabajo que tr fue creado:

    tr ':' '
    ' < ~/Desktop/myfile.txt
    • En iTerm, en MacOS, el endline personaje puede ser hecho en la entrada utilizando alt+enter. Práctico truco para dividir $PATH variable por cierto.
  3. 23

    Utilizando simplemente :

    $ tr ':' $'\n' <<< string1:string2:string3:string4:string5
    string1
    string2
    string3
    string4
    string5

    Si usted realmente necesita :

    $ sed 's/:/\n/g' <<< string1:string2:string3:string4:string5
    string1
    string2
    string3
    string4
    string5
    • Le gustaba la solución usando tr. Sencillo y práctico. Gracias
  4. 3

    Esto podría funcionar para usted (GNU sed):

    sed 'y/:/\n/' file

    o tal vez:

    sed y/:/$"\n"/ file
  5. 0

    Si usted está usando gnu sed, a continuación, puede utilizar \x0A para nueva línea:

    sed 's/:/\x0A/g' ~/Desktop/myfile.txt
    • No necesariamente. Win32 entornos de uso diferente carácter de nueva línea, y la última vez que lo comprobé, Cygwin usa gnu sed.

Dejar respuesta

Please enter your comment!
Please enter your name here