[Linux] sed grep ou awk - remplace ment de chaine de caracteres

Daniel Huhardeaux daniel.huhardeaux@::1
Dim 20 Oct 19:32:20 CEST 2024


Le 19/10/2024 à 14:20, Marc Chantreux a écrit :

>> J'ai compris. Cependant je me suis rendu compte que le : de enabled
>> disparait et que si je fais
>> search && $1 ~ / *enabled/{ $2=": true" ; search=0 }
>> le résultat devient enabled : true (espace entre enabled et le :) Je ne
>> pense pas que yaml accepte cela.
> indeed: ce dont on a besoin c'est
> [...]
>
> awk -F': ' -vOFS=': ' '
> 	$1 ~ / *Terek4$/  { search= 1 }
> 	search && $1 ~ / *enabled$/ { $2 = "true" ; search=0 }
> 	1
> ' config.yml

Bon, ce qui fonctionne en en ligne de commande ne fonctionne pas dans un 
script bash.
Le résultat final fonctionnel en script shell pour une recherche sur 3 
clés (cameras,
Terek4, enabled) est

#!/bin/sh
#
mycam=Terek4
mystate=true #or false
conf_file="/home/tootai/config.yml"

cmd_awk='
$1 ~ / *cameras$/ { search=1 }
#
# NOTE: reverse order is VERY IMPORTANT for the search == value as we 
want to modify the model AFTER the one we just tested
#
#{ if (search == 2 && $1 ~ / *enabled$/ { $2 = $mystate ; search=0 } } ; 
ne fonctionne pas dans un script
#{ if (search == 1 && $1 ~ / *$mycam$/ { search=2 } 
}                            ; ne fonctionne pas dans un script
#
{if (search == 2 && index($1, enabled) != 0) {$2=mystate; search=0}}
{if (search == 1 && index($1, mycam) != 0) {search=2}}
1'

new_conf_file=$(awk -F':' -vOFS=': ' -v mycam="$mycam" -v 
mystate="$mystate" "$cmd_awk" $conf_file)
echo "$new_conf_file">$conf_file

À noter que dans la commande awk -F': ' l'espace a du être retiré afin 
que cela soit fonctionnel.

Merci Marc pour ton eide et tes explications détaillées.

-- 
Daniel


Plus d'informations sur la liste de diffusion linux