Trouver une string (comme grep -q) dans seulement une section d'un file

Je veux écrire un Bash qui peut vérifier qu'une string existe dans un file de configuration. Je ne peux pas changer le format du file, il appartient à une application différente.

Le file est subdivisé en groupes nommés par des strings entre crochets.

Cela devrait être un succès:

[group1] MyParameter junk1 junk2 [group2] junk3 junk4 

Cela devrait être une erreur:

 [group1] junk1 junk2 [group2] MyParameter junk3 junk4 

Je peux faire un grep -q pour vérifier que MyParameter existe dans le file, mais si il est situé dans un autre groupe et non group1 , alors je suis encore busted.

Si MyParameter existait dans les deux groupes, je ne me soucierais pas assez pour signaler une erreur, tant qu'elle existait dans le group1 .

Je ne peux pas countr sur les numéros de ligne (tête, queue, etc.). En outre, je serais plus heureux s'il était suffisamment générique pour qu'il ne dépende pas du nom de group2 (le script group2 que s'il trouve une autre ligne commençant par des crochets, termine le groupe précédent).

Quand on est confronté à un problème de traitement de text, certaines personnes disent "utilisons awk". Plus souvent qu'autrement, ils ont une solution.

 awk ' /^\[.*\]$/ {group = $0} group == "[group1]" && $1 == "MyParameter" {found=1; exit} END {exit !found} ' 

Avec GNU sed vous pouvez faire

 sed -n '/\[group1\]/,/\[group2\]/{/MyParameter/p}' input-file 

qui écrira MyParameter seulement quand il est dans la section group1 . Si la section après group1 n'est pas toujours group2 , vous pouvez replace group2 par .* .

Voici un script Perl qui devrait faire le travail:

 #!/usr/bin/perl use ssortingct; use warnings; die "Usage: $0 group pattern [file...]\n" if scalar @ARGV < 2; my $group = shift; my $pattern = shift; my $curr_group = undef; my $matched = 0; while (<>) { if (/^\[(.*)\]/) { $curr_group = $1; } else { if (defined $curr_group and $curr_group eq $group and /$pattern/) { print "Match\n"; $matched = 1; } } } if (not $matched) { print "No match\n"; } 
 if [ `egrep 'MyParameter|^\[.*\]$' file.conf | head -2 | tail -1` == "MyParameter" ] then echo Success else echo Failure fi