regex
  • sed
  • grep
  • wildcard
  • string-substitution
  • 2011-06-06 18 views 5 likes 
    5

    Quiero hacer una sustitución basada en un comodín. Por ejemplo, cambie toda "tenencia" por "disposición" solo si la palabra "tenencia" aparece después de un signo '='. Básicamente una expresión regular que se correspondería con este =.*tenuresustitución de comodín sed

    El comando sed que tengo así que para esto es:

    sed 's/=.*tenure/=.*disposition/g' file.txt 
    

    Sin embargo, si paso a un archivo que contiene:

    blah blah blah = change "tenure" to "disposition" 
    

    consigo

    blah blah blah =.*disposition" to "disposition" 
    

    en lugar de:

    blah blah blah = change "disposition" to "disposition" 
    

    ¿Cómo realizo la sustitución de manera que el comodín en la expresión regular no forme parte del archivo de destino?

    Respuesta

    6

    Es necesario utilizar un grupo de captura para capturar el texto que aparece entre sus signo igual y "tenencia".

    Así

    sed 's/=\(.*\)tenure/=\1disposition/g' 
    

    Nota el uso de \1 para hacer referencia y utilizar el grupo que ha capturado.

    Así que en

    echo 'blah blah blah = change "tenure" to "disposition"' | sed 's/=\(.*\)tenure/=\1disposition/g' 
    

    obtenemos

    blah blah blah = change "disposition" to "disposition". 
    

    Ver Regex grouping.

    2
    sed 's/\(=.*\)tenure/\1disposition/g' file.txt 
    
    2

    necesita ahorrar caracteres coincidentes entre el = y la tenure para añadirlos a la salida:

    sed 's/=(.*)tenure/=\1disposition/g' file.txt 
    

    Además, se debe añadir la opción -i de sed si desea editar el archivo inplace (hacer las modificaciones al archivo en sí).

    2

    Tienes que usar backreference en sed. Utilizar de esta manera:

    sed 's/\(=.*\)tenure/\1disposition/g' 
    
    Cuestiones relacionadas