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?
davy.ai
Para agregar el texto faltante exactamente entre
example:\n - dyu
y no entretarget: something\n -dyu
, puede modificar el script awk de la siguiente manera:Explicación:
data
contiene las líneas faltantes que deben ser insertadas. Consiste en dos líneas,source:
ytarget:
, con una sangría de dos espacios./example:/
establece la banderaf
en 1 cuando la línea contieneexample:
./- dyu:/ && f
coincide con las líneas que contienen- dyu:
cuando la banderaf
está establecida. Esto corresponde a la línea inmediatamente después deexample:
.match
verifica si la línea actual contienetarget:
. Si es así, las líneas faltantes no se insertan porque ya están presentes.target:
, entonces las líneas faltantes se imprimen.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 deexample:
.