IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes GNU Discussion :

[sed] effacer les lignes 163 à [patern]-7


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Expert confirmé Avatar de frp31
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2006
    Messages
    5 196
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2006
    Messages : 5 196
    Par défaut [sed] effacer les lignes 163 à [patern]-7
    salut,

    je cherche à faire un petit script sed qui utilisera un patern fourni en variable au shell script qui execute le sed :

    le but du sed : effacer de la ligne 163 à la 7 ième ligne avant la premiere occurance du pattern recherché...

    le but est global est en fait de découper un fichier pour eliminer des pages inutiles à l'édition papier. tout en gardant les pages d'entete générées par les lignes 0 à 163.... (format PS)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
      2914  _DSC_SH 6.0 /Helvetica-I _DSC_FN 20.2 114.48 _DSC_MV (TVA pay\351e sur les d\351bits. Conform\351ment \340 nos conditions de vente. Marchandise vendue avec une clause de r\351serve de propri\351t\351.)_DSC_SH^M
      2915  _DSC_RS^M         <============= DEBUT de la premiere page à garder 
      2916  _DSC_RS^M
      2917  _DSC_SV^M
      2918  /Courier _DSC_L1 /Courier-I _DSC_LD^M
    quand je modifie à la main je fait 163,2915d dans ce cas là
    et le numero de facturation (le pattern) est à la ligne 2922 dans cet exemple.

    J'espere que vous pourrez m'aider.

  2. #2
    LLB
    LLB est déconnecté
    Membre émérite
    Inscrit en
    Mars 2002
    Messages
    968
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 968
    Par défaut
    Si tu n'arrives pas à faire ça en pur sed (ce qui n'est pas évident), utilise d'autres commandes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    line=$(grep -n "$pattern" file.ps | head -1 | sed 's/:.*//')
    sed 163,$(($line - 7))d file.ps

  3. #3
    Expert confirmé Avatar de frp31
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2006
    Messages
    5 196
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2006
    Messages : 5 196
    Par défaut
    c'est ce que j'ai fait mais avec un vi et quelques autres trucs autour en fait....
    mais bon comme je suis en train de m'aguerrir sur les regexp l'usage de sed et vi je voulais tanter de faire un truc de la mort


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    #!/bin/ksh
     
    . /exploit/commun/cfg/env_exploit 
     
    # automatiser la decoupe des fichiers de factures maritimes
    # pour l'instant ne coupe que les factures et duplicatats precedent le numero de facture passe en parametre
    # et ca imprimera donc a partir de la jusqu a la fin
     
    # version 0.0  04/03/2008
     
    # ne pas utiliser se script pour l'instant c'est encore un test merci
     
    # le script prend 3 parametres 
    # 1-nom du fichier PS
    # 2-le numero de la facture
    # 3-nom de l imprimante si il est present ca imprime dessus
     
    # creer une fonction usage
    usage()
    {
            echo  
            echo USAGE : $0 FICHIER numero_facture imprimante\(facultative\)
            echo
    }
     
    # verifier le nombre de parametres (au moins 2)
    if [ $# -lt 2 ] ; then
            mes_err "FATAL" $0 "le nombre de parametres est incorrect" "L execution a ete interrompu" "Analyser l incident"
            echo le nombre de parametres est incorrect L execution a ete interrompu Analyser l incident 
            usage
            exit 1
    fi
     
    # tester l existance du fichier
    if [ ! -f $1 ]; then
            mes_err "FATAL" $0 "le fichier $1 n existe pas" "L execution a ete interrompu" "Analyser l incident"
            echo "FATAL $0 le fichier $1 n existe pas L execution a ete interrompu Analyser l incident"
            exit 1
    fi
     
    # tester l existance du numero de facture dans le fichier
    if [ $(grep -i $2 $1 | wc -l) -eq 0 ] ; then
            mes_err "FATAL" $0 "le fichier $1 ne contient pas la facture #$2" "L execution a ete interrompu" "Analyser l incident"
            echo "FATAL $0 le fichier $1 ne contient pas la facture #$2 L execution a ete interrompu Analyser l incident"
            exit 1
    fi
     
    # genere un format de date pour permetre la creation d'un nom de fichier lisible
    DATE=$(date +"%y%m%d")
     
    #  calcul du numero de la ligne jusqu a laquelle il faut effacer depuis la 163
    n_ligne=$(cat -n $1 | grep "_DSC_FN _DSC_BK 520.2 800.48 _DSC_MV ("$2")" | awk '{print $1}' | head -1)
    n_ligne=$(($n_ligne-7)) 
     
    echo  decoupage de la ligne 163 a la ligne $n_ligne
     
    # copie du fichier 
    cp $1 /tmp/$2-$DATE.ps
    if [ $? -ne 0 ] ; then
            #  message d erreur
            mes_err "FATAL" $0 "la copie du fichier cp $1 /tmp/$2-$DATE.ps echoue" "L execution a ete interrompu" "Analyser l incident"
            echo "FATAL $0 la copie du fichier cp $1 /tmp/$2-$DATE.ps echoue L execution a ete interrompu Analyser l incident"
            exit 1
    fi
     
    # executer la decoupe
    vi -c "163,"$n_ligne"d|:wq" /tmp/$2-$DATE.ps
    if [ $? -ne 0 ] ; then
            #  message d erreur
            echo 
    fi
     
    #  tester la presence du parametre 3 
    if [ $# -eq 3 ] ; then
            #  tester que l'imprimante existe
            if [ $((grep $3 /etc/printcap | wc -l)) -gt 0 ] ; then
                    lpr -P $3 /tmp/$2-$DATE.ps
                    if [ $? -ne 0 ] ; then
                            mes_err "FATAL" $0 "l edition de /tmp/$2-$DATE.ps n a pu s effectuer sur $3" "Merci de verifier le spoolex" "Analyser l incident"
                            echo "FATAL $0 l edition de /tmp/$2-$DATE.ps n a pu s effectuer sur $3 Merci de verifier le spoolex Analyser l incident"
                            exit 1
                    fi
            fi
    fi
     
    #  deplacement du fichier genere dans les archives de factures maritimes
    mv /tmp/$2-$DATE.ps /OA_div/prd/gp/gpgc/11.5.0/fic/SODIFRANCE/factures_maritimes/
    if [ $? -ne 0 ] ; then
            #  message d erreur
            mes_err "FATAL" $0 "le deplacement du fichier mv /tmp/$2-$DATE.ps /OA_div/prd/gp/gpgc/11.5.0/fic/SODIFRANCE/factures_maritimes/ echoue" "L execution a ete interrompu" "Analyser l incident"
            echo "FATAL $0 le deplacement du fichier mv /tmp/$2-$DATE.ps /OA_div/prd/gp/gpgc/11.5.0/fic/SODIFRANCE/factures_maritimes/ echoue L execution a ete interrompu Analyser l incident"
            exit 1
    fi
     
    exit 0

Discussions similaires

  1. Effacer les lignes où un champ est non nul
    Par laurentSc dans le forum Langage SQL
    Réponses: 2
    Dernier message: 24/07/2014, 15h26
  2. [ GTKMM ] effacer les lignes dans un TREEVIEW
    Par LM_programme dans le forum GTK+
    Réponses: 4
    Dernier message: 19/02/2011, 17h23
  3. [E-02] Effacer les lignes vides
    Par Slici dans le forum Excel
    Réponses: 4
    Dernier message: 06/03/2009, 08h36
  4. Comment effacer les lignes dans la console
    Par 7rouz dans le forum Général Java
    Réponses: 4
    Dernier message: 30/12/2008, 15h17
  5. effacer les lignes vides
    Par Samanta dans le forum Format d'échange (XML, JSON...)
    Réponses: 12
    Dernier message: 30/06/2005, 18h02

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo