Necesito reemplazar toda la línea con sed si coincide con un patrón.
Por ejemplo, si la línea es ‘uno dos seis tres cuatro’ y si ‘seis’ está ahí, entonces toda la línea debe ser reemplazado con «culpa».

  • Han considerado que la grep -v?
  • Me doy cuenta de que hace ya un par de años, pero usted debe recordar para volver y upvote/aceptar una respuesta si era útil para usted-y parece que hay un par que parecen responder a la pregunta correctamente.
InformationsquelleAutor irek | 2013-05-08

3 Comentarios

  1. 60

    Usted puede hacerlo con cualquiera de estos:

    sed 's/.*six.*/fault/' file     # check all lines
    sed '/six/s/.*/fault/' file     # matched lines -> then remove

    Se obtiene el total de la línea que contiene six y lo reemplaza con fault.

    Ejemplo:

    $ cat file
    six
    asdf
    one two six
    one isix
    boo
    $ sed 's/.*six.*/fault/'  file
    fault
    asdf
    fault
    fault
    boo

    Se basa en esta solución a Reemplazar toda la línea que contiene una cadena con Sed

    Más general, se puede utilizar una expresión sed '/match/s/.*/replacement/' file. Se realizará el sed 's/match/replacement/' expresión en aquellas líneas que contienen match. En tu caso sería:

    sed '/six/s/.*/fault/' file

    Lo que si tenemos ‘un, dos, seis, ocho, once, tres, cuatro» y queremos
    incluyen el ‘ocho’ y ‘once’ como «malas» palabras?

    En este caso podemos utilizar el -e para varias condiciones:

    sed -e 's/.*six.*/fault/' -e 's/.*eight.*/fault/' file

    y así sucesivamente.

    O también:

    sed '/eight/s/.*/XXXXX/; /eleven/s/.*/XXXX/' file
    • Lo que si tenemos ‘un, dos, seis, ocho, once, tres, cuatro» y queremos incluir ‘ocho’ y ‘once’ como «malas» palabras? S/.*seis|ocho|once.*/fallo/g de trabajo?
    • Es posible que con los -e, ver mi respuesta actualizada.
    • Gracias por su tiempo!
    • Lo que si quiero guardar los cambios en el mismo archivo?
    • sólo uso sed -i. Es mejor usar también sed -i.bak por lo que el archivo original se sustituye sino que también realiza copias de seguridad de file.bak.
    • Gracias. Funciona exactamente como usted dijo.
    • El /g bandera es inútil aquí, como no puede ser nunca un solo partido en una línea, y usted sólo se preocupa de si hay uno o más partidos de todos modos.
    • estás en lo correcto. Algo + .* tendrá un único partido por línea, si los hubiere. Gracias!
    • Esta es la respuesta correcta

  2. 5

    Por encima de las respuestas trabajado muy bien para mí, sólo mencionar una forma alternativa

    Partido único patrón y reemplazar con uno nuevo:

    sed -i '/six/c fault' file

    Coincidir con varios patrón y reemplácela por una nueva(la concatenación de comandos):

    sed -i -e '/one/c fault' -e '/six/c fault' file
  3. 3

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

    sed -e '/six/{c\fault' -e ';d}' file

    o:

    sed '/six/{c\fault'$'\n'';d}' file

Dejar respuesta

Please enter your comment!
Please enter your name here