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

Daniel Huhardeaux daniel.huhardeaux@::1
Sam 19 Oct 13:54:54 CEST 2024


Le 18/10/2024 à 19:40, Marc Chantreux a écrit :
> On Fri, Oct 18, 2024 at 06:52:30PM +0200, Daniel Huhardeaux wrote:
>> Le 18/10/2024 à 18:42, Marc Chantreux a écrit :
>>> je sais que certains ont des réticences avec awk mais la solution
>>> awk est simple et moins fragile que celle de sed
>>>
>>> awk -F: '
>>> 	$1 ~ / *Terek4 */ { search=1 }
>>> 	search && $1 ~ / *enabled */ { $2 = "true" ; search=0 }
>>> 	1
>>> ' <<%
>> Je confirme, c'est également fonctionnel. Cependant pas encore tout compris
>> ;)
> -F:   => les colonnes sont séparées par des ":"
>
> donc colonne 1 contient la clef et colonne 2 contient la value seulement
> si y'a pas de : dans celle-ci (sinon c'est le debut)
>
> $n    => la valeur de la colonne n (donc $1 == colonne 1)
>
>
> un script awk est organisé sous la forme condition {action}
>
> 	condition {action}
>
> awk -F: '
> 	# pour les lignes dont la colonne 1 matchent le motif
> 	# (donc l clef est Terek4)
> 	# je met la valeur search a 1
> 	$1 ~ / *Terek4 */ { search=1 }
>
> 	# quand search est à 1 et que la colonne 1 contient enabled
> 	# * j'écris "true" dans la colonne 2
> 	# je passse search à 0
> 	search && $1 ~ / *enabled */ { $2 = "true" ; search=0 }
>
> 	# quand y'a pas d'action, l'action par defaut est print
> 	# 1 est une condition toujours vrai
> 	# donc ce 1 veut dire: affiche toutes les lignes
> 	1
> '

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.

Aussi, en me basant sur ton exemple perl j'ai tenté d'incorporer la 1ère 
clé à camera,
la seconde à Terek4 puis enabled.

awk -F: '
         $1 ~ / *cameras */ { search=1 }
         search && $1 ~ / *Terek4 */ { search=2 }
         search=2 && $1 ~ / *enabled/{ $2=": plop" ; search=0 }
         1
' config.yml

Le problème avec cela est que tous les enabled: <valeur> sont modifiés


Plus d'informations sur la liste de diffusion linux