[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