Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2938 connectés 

  FORUM HardWare.fr
  Linux et OS Alternatifs
  Codes et scripts

  [bash] Chercher deux lignes vides consécutives

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[bash] Chercher deux lignes vides consécutives

n°1181377
le fou
Forza Massallia
Posté le 24-11-2009 à 10:18:29  profilanswer
 

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)
mood
Publicité
Posté le 24-11-2009 à 10:18:29  profilanswer
 

n°1181394
kisscoolz
Posté le 24-11-2009 à 11:03:59  profilanswer
 

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

n°1181448
le fou
Forza Massallia
Posté le 24-11-2009 à 12:13:04  profilanswer
 

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)
n°1181531
zecrazytux
Posté le 24-11-2009 à 15:30:12  profilanswer
 

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
n°1181537
le fou
Forza Massallia
Posté le 24-11-2009 à 15:35:54  profilanswer
 

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)
n°1181548
zecrazytux
Posté le 24-11-2009 à 15:48:22  profilanswer
 

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


---------------
Blog photo/récits activités en montagne http://planetcaravan.net
n°1181563
le fou
Forza Massallia
Posté le 24-11-2009 à 16:05:53  profilanswer
 

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)
n°1181565
zecrazytux
Posté le 24-11-2009 à 16:06:46  profilanswer
 

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
n°1181649
le fou
Forza Massallia
Posté le 25-11-2009 à 08:48:48  profilanswer
 

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)
n°1181796
zecrazytux
Posté le 25-11-2009 à 15:04:38  profilanswer
 

à 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
mood
Publicité
Posté le 25-11-2009 à 15:04:38  profilanswer
 

n°1181813
le fou
Forza Massallia
Posté le 25-11-2009 à 15:20:56  profilanswer
 

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)
n°1183229
le fou
Forza Massallia
Posté le 02-12-2009 à 14:15:16  profilanswer
 

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)
n°1183287
zecrazytux
Posté le 02-12-2009 à 16:18:17  profilanswer
 

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
n°1183299
le fou
Forza Massallia
Posté le 02-12-2009 à 16:58:18  profilanswer
 

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)
n°1186791
Ttienne
C'est pas pour me vanter, mais
Posté le 18-12-2009 à 09:52:46  profilanswer
 

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
n°1186826
le fou
Forza Massallia
Posté le 18-12-2009 à 13:12:46  profilanswer
 

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)
n°1186828
wedgeant
Da penguin inside
Posté le 18-12-2009 à 14:07:16  profilanswer
 

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
n°1186830
le fou
Forza Massallia
Posté le 18-12-2009 à 14:10:30  profilanswer
 

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)
n°1186837
wedgeant
Da penguin inside
Posté le 18-12-2009 à 14:25:55  profilanswer
 

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
n°1186942
Ttienne
C'est pas pour me vanter, mais
Posté le 19-12-2009 à 10:04:03  profilanswer
 

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

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Linux et OS Alternatifs
  Codes et scripts

  [bash] Chercher deux lignes vides consécutives

 

Sujets relatifs
[bash] empilage de grepscript bash pour ftp
[bash] grep plusieurs pattern, et autres joyeusetés...[bash] stats des fichiers par taille
[bash] Contrôler la longueur des lignes dans un fichier.[bash/perl] comparer un nom de dossier avec la date
script bash et setuid[ Linux ][ Script ][ Démarrage ] : Who, Wget résultats vides? PQ?
bash, écrire dans un tableau 
Plus de sujets relatifs à : [bash] Chercher deux lignes vides consécutives


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR