es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo insertar texto entre cadenas en dos líneas sucesivas con awk.

Tengo un archivo YAML con algunas líneas perdidas (- source y target debajo de ejemplo:) donde word1 a continuación necesita ser corregido pero word2 está bien.

 - dyu: word1
    alt:
    trans:
      - lang: fr
        detail: null
        speech:
          - type: null
            def:
              - gloss: gloss1
                note: null
                example:
  - dyu: word2
    alt:
    trans:
      - lang: fr
        detail: null
        speech:
          - type: null
            def:
              - gloss: gloss2
                note: null
                example:
                  - source: some example source
                    target: some example target
  - dyu: word3

He utilizado lo siguiente para insertar el texto faltante:

awk -i inplace -v data='                  - source:\n                    target:' '/- dyu:/ && f {print data; f=0}1' $file

Pero el problema es que también insertará el texto incluso donde ya existe. Necesito agregar el texto faltante exactamente entre example:\n - dyu, y no entre target: algo\n -dyu.

Resultado deseado:

 - dyu: word1
    alt:
    trans:
      - lang: fr
        detail: null
        speech:
          - type: null
            def:
              - gloss: gloss1
                note: null
                example:
                  - source: 
                    target: 
  - dyu: word2
    alt:
    trans:
      - lang: fr
        detail: null
        speech:
          - type: null
            def:
              - gloss: gloss2
                note: null
                example:
                  - source: some example source
                    target: some example target
  - dyu: word3

¿Cómo puedo lograr esto?

Tags:  

Answer

  1. Avatar for davy.ai

    Para agregar el texto faltante exactamente entre example:\n - dyu y no entre target: something\n -dyu, puede modificar el script awk de la siguiente manera:

    awk -i inplace -v data="  - source:\n    target:\n" '
    /example:/ {
        f=1
    }
    /- dyu:/ && f {
        if (!match($0, /target:/)) {
            print data
        }
        f=0
    }
    1' $file
    

    Explicación:

    • La variable data contiene las líneas faltantes que deben ser insertadas. Consiste en dos líneas, source: y target:, con una sangría de dos espacios.
    • El patrón /example:/ establece la bandera f en 1 cuando la línea contiene example:.
    • El patrón /- dyu:/ && f coincide con las líneas que contienen - dyu: cuando la bandera f está establecida. Esto corresponde a la línea inmediatamente después de example:.
    • La función match verifica si la línea actual contiene target:. Si es así, las líneas faltantes no se insertan porque ya están presentes.
    • Si la línea no contiene target:, entonces las líneas faltantes se imprimen.
    • El 1 al final es una forma abreviada de {print}, que imprime todas las líneas.

    Este script modificado agrega las líneas faltantes solo cuando no hay una línea target: presente después de example:.

Comments are closed.