Aquí están mis intentos para reemplazar un b con un carácter de nueva línea mediante sed mientras se ejecuta bash

$> echo 'abc' | sed 's/b/\n/'
anc

que no, que no es

$> echo 'abc' | sed 's/b/\n/'
a\nc

no, no es eso tampoco. El resultado que yo quiero es

a
c

AYUDA!

  • Esto funciona para mí la manera que usted desea en Ubuntu 11.10 con GNU sed. ¿Qué versión de sed estás usando?
  • echo ‘abc’ | sed ‘s/b/\n/’ funciona bien en mi bash en Debian (Wheezy). Mi versión de bash: GNU bash, la versión 4.1.5(1) liberación (x86_64-pc-linux-gnu). Mi sed versión: sed de GNU versión 4.2.1
  • No estoy seguro, manual no dice y sed -V no trabajo, pero estoy en SunOS 5.10
  • En Solaris, usted puede conseguir el POSIX compatible ‘sed’ mediante el establecimiento de esta ruta de acceso: ruta=/usr/xpg6/bin:/usr/xpg4/bin:/usr/css/bin:$PATH
InformationsquelleAutor spraff | 2012-01-24

5 Comentarios

  1. 14

    Parece que está en BSD o Solaris. Intente esto:

    [jaypal:~/Temp] echo 'abc' | sed 's/b/\ 
    > /'
    a
    c

    Agregar un negro de la barra y pulsar enter y completar tu sed declaración.

    • Sí! Pero, ¿por qué tengo la necesidad de \ antes de que me enter?
    • Una vez que me di cuenta de que estaba en Solaris he probado el manual-Enter, pero se olvidó de la barra invertida al final de la línea. Buena captura.
    • Solaris sed es extremadamente fecha, y que requiere de una explícita de salto de línea en lugar de un \n.
    • Explícito newline me pasa, pero ¿por qué la barra invertida antes de él?
    • La barra invertida es una manera de decirle a bash «continuar con este comando en la línea siguiente». Usted puede hacerlo con cualquier bash comando cuando se desea dividir por la claridad.
    • Gracias Dan! Confía en mí me gusta trabajar en solaris cajas en el trabajo después de acostumbrarse a GNU golosinas. 🙂
    • Gracias de nuevo. Sí @spraff, backslash al final es una manera de decirle a la shell para aguantar, hay más cosas que en la línea siguiente. 🙂
    • Yo uso explícito de las líneas en sin escape comillas simples en bash en casa en Ubuntu y nunca de barra diagonal inversa-el prefijo. Que es excepcional, Ubuntu o Solaris?
    • Solaris es UNIX y Ubuntu es un derivado de Debian que es Linux. Si agrega una barra diagonal inversa en su máquina de Ubuntu que todavía funciona. Desde Solaris se adhiere a los estándares POSIX si desea hacer un script que funcione a través de las diferentes plataformas agregar una barra diagonal inversa será útil
    • Si usted tiene bash entonces usted también debe ser capaz de escribir algo como esto, incluso en Solaris, y que funcionan: echo abc | sed 's/b/\'$'\n'/ – la ventaja aquí es que usted no tiene que molestos significativo salto de línea, lo que hace que copiar y pegar más fácil. $'\n' es un bashy manera de insertar literal de las secuencias de escape. Por el momento sed ve que es el mismo que el Jaypal de la versión.
    • También: En este caso la barra invertida NO está siendo interpretado por bash, sino por sed. sed requiere que los saltos de línea en el modelo de reemplazo se escapó con \. Considere esto: (set -x ; echo abc | sed "s/b/\$PATH/") que muestra que bash ha interpretado \$ y sed sólo ve $, vs: (set -x ; echo abc | sed 's/b/\'$'\n'/) que muestra que bash ha ampliado $'\n' pero a la izquierda de la \ antes de que sed. Para la comparación intente ejecutar echo abc | sed "s/b/\"$'\n'/ y ver lo que se obtiene.
    • Cuando hago esto en SunOS 5.10 me sale el error » sed: comando dañados: s/b/`
    • por favor enviar su upvoted comentario por separado como una respuesta, ya que es mejor que la mayoría de los demás.

  2. 3

    No diga que quiere a nivel mundial reemplazar todos b. Si sí, usted quiere tr lugar:

    $ echo abcbd | tr b $'\n'
    a
    c
    d

    Me funciona en Solaris 5.8 y bash 2.03

  3. 3
    $ echo 'abc' | sed 's/b/\'$'\n''/'
    a
    c

    En Bash, $'\n' se expande a una sola citado carácter de nueva línea (ver «CITAR» sección de man bash). Las tres cadenas se concatenan antes de ser pasado a la sed como un argumento. Sed requiere que el carácter de nueva línea de escape, por lo tanto la primera barra diagonal inversa en el código que he pegado.

    • Bonita respuesta! echo 'abc' | sed $'s,b,\\\n,' es aún más claro, creo.
  4. 0
    echo 'abc' | sed 's/b/\'\n'/' 

    le falta '' alrededor de \n

    • Que no funciona. También, no que el tornillo de seguridad de bash?
    • sólo probado en ubuntu 11.01 y funciona. mi versión de bash es GNU bash, versión 4.2.10(1) liberación (i686-pc-linux-gnu) y sed version es 4.2.1
    • A mi me funciona en bash 4.3.42(1)
  5. 0

    En un archivo multiline tuve que tubo a través de tr en ambos lados de la sed, así:

    echo "$FILE_CONTENTS" | \
    tr '\n' ¥ | tr ' ' ∑ | mySedFunction $1 | tr ¥ '\n' | tr ∑ ' '

    Ver unix le gusta a eliminar saltos de línea y extra espacios y todo tipo de cosas, porque supongo que le pareció la cosa para hacer en el tiempo cuando se hizo de nuevo en la década de 1900. De todos modos, este método de muestro anterior soluciona el problema al 100%. Ojalá hubiera visto a alguien post de este lugar porque me habría ahorrado cerca de tres horas de mi vida.

Dejar respuesta

Please enter your comment!
Please enter your name here