Solução complexa Grep
+ GNU Awk
:
O conteúdo do script awk
crucial, digamos add_param_by_id.awk
:
#!/bin/awk -f
BEGIN{ FS=":[[:space:]]+" }
NR==FNR{ a[$1] = $2; next }
match($0, /\<id="([^"]+)"/, b) && b[1] in a{
sub(/\<id="[^"]+"/, "& some_param=2"a[b[1]]"2")
}1
Os principais comandos:
export pat="($(cut -d':' -f1 source.yml | paste -s -d'|'))"
grep -ElZr "\<id=\"$pat\"" --include=*.txt | xargs -0 -I{} sh -c \
'awk -f add_param_by_id.awk source.yml "$1" > "/tmp/$$" && mv "/tmp/$$" "$1"' _ {}
-
pat
- variável contendo o grupo de alternância regex com identificadores, por exemplo,(apples|grapes|trees|strawberry)
-
grep -ElZr id=\"$pat\" --include=*.txt
- imprime todos os nomes de arquivos que foram correspondidos por qualquer um dos identificadores especificados
Exemplo de conteúdo do arquivo após o processamento:
This is some plain text
Toreplace string contains id="apples" some_param="Apples are very tasty"
The most vitamin-rich berry is id="strawberry" some_param="Yummy"