[bash] Chercher deux lignes vides consécutives

Chercher deux lignes vides consécutives [bash] - Codes et scripts - Linux et OS Alternatifs

Marsh Posté le 24-11-2009 à 10:18:29    

Bonjour,

 

Je cherche faire un script qui me permettrait de controler qu'il n'y a pas deux lignes vides à la suite l'une de l'autre.
J'ai essayé avec ceci

 

awk '{if(length($0)==0){
        lg_vide++        
        if (lg_vide == 2) {
            lg_vide=0
            print "+> Il y a deux lignes vides avant la ligne "NR
        }
       }}' $FICHIER

 

Seulement, la remise à zero de la variable lg_vide ne marche pas. Je veux dire, qu'elle n'est pas remise a zero si une seule ligne vide est detecté.

 

Je suis ouvert à toute idée.
merci


Message édité par le fou le 24-11-2009 à 10:32:09

---------------
Celui qui sauve une vie, sauve l'humanité (Le Talmud) - Personne n'a plus grand amour que celui de donner sa vie pour ses amis (Jean XV, 13)
Reply

Marsh Posté le 24-11-2009 à 10:18:29   

Reply

Marsh Posté le 24-11-2009 à 11:03:59    

Ca parait logique puisque dans ta condition tu lui dit de remettre à 0 lg_vide si et seulement si lg_vide est égale à 2

Reply

Marsh Posté le 24-11-2009 à 12:13:04    

kisscoolz a écrit :

Ca parait logique puisque dans ta condition tu lui dit de remettre à 0 lg_vide si et seulement si lg_vide est égale à 2


 
Oui, je suis d'accord. Et je l'avais bien vu, mais il faudrait que je compare le numéro des lignes entres elles pour savoir ou je suis.


---------------
Celui qui sauve une vie, sauve l'humanité (Le Talmud) - Personne n'a plus grand amour que celui de donner sa vie pour ses amis (Jean XV, 13)
Reply

Marsh Posté le 24-11-2009 à 15:30:12    

Citation :


#!/usr/bin/env perl
 
use strict;
use warnings;
 
my $empty = 0;
 
while(<> ) {
  if(/^$/) {
    $empty++;
    next;
  } elsif($empty eq 1) {
    $empty = 0;
  } elsif($empty > 1) {
    print "il y a $empty lignes vides avant la ligne", $., "\n";
    $empty = 0;
  }
}


---------------
Blog photo/récits activités en montagne http://planetcaravan.net
Reply

Marsh Posté le 24-11-2009 à 15:35:54    

Merci pour ta réponse. Ca peut me donner des idées.
Cependant, c'est pour être intégré dans un script bash, donc je prefererais utiliser du bash. A moins, que je puisse insérer du Perl dans un script Bash (mais j'en sais rien)


Message édité par le fou le 24-11-2009 à 15:36:04

---------------
Celui qui sauve une vie, sauve l'humanité (Le Talmud) - Personne n'a plus grand amour que celui de donner sa vie pour ses amis (Jean XV, 13)
Reply

Marsh Posté le 24-11-2009 à 15:48:22    

bha tu reprends "l'algo" et tu l'écris en awk


---------------
Blog photo/récits activités en montagne http://planetcaravan.net
Reply

Marsh Posté le 24-11-2009 à 16:05:53    

Petite question , que signifie "while(<> )"


---------------
Celui qui sauve une vie, sauve l'humanité (Le Talmud) - Personne n'a plus grand amour que celui de donner sa vie pour ses amis (Jean XV, 13)
Reply

Marsh Posté le 24-11-2009 à 16:06:46    

le fou a écrit :

Petite question , que signifie "while(<> )"


 
pour chaque ligne sucée de STDIN


---------------
Blog photo/récits activités en montagne http://planetcaravan.net
Reply

Marsh Posté le 25-11-2009 à 08:48:48    

merci, pour ton aide.
j'ai adapté ta version en utilisant awk et je crois que j'ai réussi.
:


#!/bin/bash
   
empty=0
 
awk '{  
  if (length($0)==0) {
    empty++
    next
   }
   
  else {
    if (empty>1) {
      empty=0
      print "failed ligne" NR
    }
    else {
      empty=0
    }
  }
 }' $1


---------------
Celui qui sauve une vie, sauve l'humanité (Le Talmud) - Personne n'a plus grand amour que celui de donner sa vie pour ses amis (Jean XV, 13)
Reply

Marsh Posté le 25-11-2009 à 15:04:38    

à la relecture le next n'est pas nécessaire, il est effectué implicitement, puis qu'on a pas d'autre intruction que le if/elsif/elsif


---------------
Blog photo/récits activités en montagne http://planetcaravan.net
Reply

Marsh Posté le 25-11-2009 à 15:04:38   

Reply

Marsh Posté le 25-11-2009 à 15:20:56    

Tu as raison. merci de la précision (et de ton aide aussi).


---------------
Celui qui sauve une vie, sauve l'humanité (Le Talmud) - Personne n'a plus grand amour que celui de donner sa vie pour ses amis (Jean XV, 13)
Reply

Marsh Posté le 02-12-2009 à 14:15:16    

Petite question subsidiaire :
Dés que je rencontre plus d'une ligne vide consécutive, je met un flag (variable ETAT="1" ) et une fois ma commande awk terminé, je teste ce flag pour afficher mon message d'erreur. Or, je n'ai jamais ce message, meme si awk a trouvé quelque chose. Mon bout de code :


ETAT="0"
 
awk '{
    if(length($0) > '$COLONNE_MAX') {
        print "+> ligne "NR" est trop longue"
        ETAT="1"
     }
}' $FICHIER_VHDL
 
if [ "$ETAT" -ne "0" ]; then
    echo -e "--> Failed \n"
else
    echo -e "--> OK \n"


---------------
Celui qui sauve une vie, sauve l'humanité (Le Talmud) - Personne n'a plus grand amour que celui de donner sa vie pour ses amis (Jean XV, 13)
Reply

Marsh Posté le 02-12-2009 à 16:18:17    

normal, c'est une variable awk, pas shell.
 
tu peux afficher le message dans awk, dans un bloc END { }


---------------
Blog photo/récits activités en montagne http://planetcaravan.net
Reply

Marsh Posté le 02-12-2009 à 16:58:18    

Merci beaucoup. C'est exactement ce que je voulais. Décidement awk me surprend.


---------------
Celui qui sauve une vie, sauve l'humanité (Le Talmud) - Personne n'a plus grand amour que celui de donner sa vie pour ses amis (Jean XV, 13)
Reply

Marsh Posté le 18-12-2009 à 09:52:46    

On peut essayer aussi :

Code :
  1. #!/bin/bash
  2.  
  3. awk '{
  4.     /^$/ { if ( ++empty > 1 ) print "failed ligne" NR; exit }
  5.   ! /^$/ { empty=0 }
  6. }' $1

C'est plus concis.
Et si tu veux parser tout le fichier, tu enlèves le "exit".

Message cité 1 fois
Message édité par Ttienne le 18-12-2009 à 09:59:11

---------------
Y a de la bière, sur Véga, hein ? Si y'en a pas, on y va pas ! Et pis c'est tout ! :P | c'est vendu depuis lgtps
Reply

Marsh Posté le 18-12-2009 à 13:12:46    

Ttienne a écrit :

On peut essayer aussi :

Code :
  1. #!/bin/bash
  2.  
  3. awk '{
  4.     /^$/ { if ( ++empty > 1 ) print "failed ligne" NR; exit }
  5.   ! /^$/ { empty=0 }
  6. }' $1

C'est plus concis.
Et si tu veux parser tout le fichier, tu enlèves le "exit".


 
 
Je comprends le principe que tu appliques. Mais qu'est ce que /^$/?
 


---------------
Celui qui sauve une vie, sauve l'humanité (Le Talmud) - Personne n'a plus grand amour que celui de donner sa vie pour ses amis (Jean XV, 13)
Reply

Marsh Posté le 18-12-2009 à 14:07:16    

une expression régulière qui signifie que le caractère de fin de ligne (représenté par $) est collé au caractère de début de ligne (représenté par ^), donc une regex qui représente une ligne vide :o


---------------
Wedge#2487 @HS -#- PW: +∞ -#- Khaz-Modan/Boltiz @WoW
Reply

Marsh Posté le 18-12-2009 à 14:10:30    

wedgeant a écrit :

une expression régulière qui signifie que le caractère de fin de ligne (représenté par $) est collé au caractère de début de ligne (représenté par ^), donc une regex qui représente une ligne vide :o


 
Ok, pour l'explication (et merci) mais quel est l'interet de le representé ici?


---------------
Celui qui sauve une vie, sauve l'humanité (Le Talmud) - Personne n'a plus grand amour que celui de donner sa vie pour ses amis (Jean XV, 13)
Reply

Marsh Posté le 18-12-2009 à 14:25:55    

tu devrais jeter un oeil sur la page de man de awk, ça serait bien utile je pense :o


---------------
Wedge#2487 @HS -#- PW: +∞ -#- Khaz-Modan/Boltiz @WoW
Reply

Marsh Posté le 19-12-2009 à 10:04:03    

le fou a écrit :


 
Ok, pour l'explication (et merci) mais quel est l'interet de le representé ici?


Allez pour t'aider à mettre ton nez dans la doc, dans le principe, awk exécute des actions en fonction de la correspondance de la ligne avec un motif donné par une regex (en angliche : pattern matching)
Donc la syntaxe générale, c'est :
 

awk '{
   motif1 { actions }
   motif2 { actions }
   ...
   motifn { actions }
}


 
BEGIN et END étant 2 "motifs" particuliers.
Chaque ligne du fichier d'entrée peut être traitée plusieurs fois, si plusieurs motifs correspondent, et dans l'ordre de la déclaration des motifs. Pour le détail des actions et la syntaxe des patterns (motifs), man awk et man regex
 
:P


---------------
Y a de la bière, sur Véga, hein ? Si y'en a pas, on y va pas ! Et pis c'est tout ! :P | c'est vendu depuis lgtps
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed