Tengo una línea tales como:

sed -i 's/mystring/newstring/' $target

Este comando va a cambiar todo mystring a newstring.

Lo que quiero ahora es: cuando el programa se ve mystring, ¿cómo puedo comprobar la corriente de línea si la cadena searchstring existe o no? Si existe, newstring es 1; de lo contrario, newstring es 0.

  • Lo que realmente tratando de hacer aquí? Por favor describa el problema que estamos tratando de resolver, y no la manera de pensar de sed que debe resolverlo.
  • en realidad me refería, tengo 2 patrones. Para todos los patternA he encontrado. Voy a comprobar si patternB es existir en esta línea o no.
InformationsquelleAutor Anders Lind | 2012-08-14

2 Comentarios

  1. 50

    Solución

    Suponiendo que el archivo de entrada de $target contiene lo siguiente:

    some text mystring some other text
    some text mystring a searchstring
    just some more text

    Este comando:

    sed -i -e '/searchstring/s/mystring/1/; /searchstring/! s/mystring/0/' $target

    va a cambiar su contenido:

    some text 0 some other text
    some text 1 a searchstring
    just some more text

    Explicación

    La secuencia de comandos contiene dos sustituto (s) comandos separados por un punto y coma.

    El comando sustituir acepta opcional rango de direcciones que seleccionar las líneas a las que la sustitución debe tener lugar.

    En este caso regexp dirección se utiliza para seleccionar las líneas que contienen la searchstring para el primer comando; y las líneas que no contienen el searchstring (nota: el signo de exclamación después de la regexp negando el partido) para el segundo.

    Editar

    Este comando va a realizar mejor y producir el mismo resultado:

    sed -i -e '/searchstring/s/mystring/1/; s/mystring/0/' $target

    El punto es que los comandos son ejecutados de forma secuencial y por lo tanto, si todavía hay un mystring subcadena en la línea actual después de el primer comando terminado, entonces no hay searchstring en ella.

    Felicitaciones a user946850.

    • Estaban un poco más rápido 🙂
    • A pesar de que su versión se realiza más rápido. Robó 😀
    • Sólo una cuestión menor: Un proceso parece #! que no veo en tu código..
    • Gracias por señalarme a esa cuestión. Fijo.
    • No es necesario el uso de la -e opción (consulte este respuesta).
  2. 15

    Esto es de la sed uno-trazadores de líneas página:

    La OPTIMIZACIÓN DE la VELOCIDAD: Si la velocidad de ejecución debe ser mayor (debido a la
    grandes archivos de entrada o procesadores lentos o disco duro de ordenadores), sustitución
    se ejecute más rápidamente si el «encontrar» la expresión se especifica antes de
    dando la «s/…/…/» la instrucción. Por lo tanto:

    sed 's/foo/bar/g' filename         # standard replace command
    sed '/foo/s/foo/bar/g' filename   # executes more quickly
    sed '/foo/s//bar/g' filename      # shorthand sed syntax

    La velocidad no es el problema de la cuestión en la mano, pero la sintaxis de sugerencias para ayudar a la formulación de la solución:

    sed -i '/searchstring/s/mystring/1/; s/mystring/0/' $target

Dejar respuesta

Please enter your comment!
Please enter your name here