Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 02/07/2009, à 14:21

vincentp010

[bash]supprimer n lignes avant expression [Résolu]

Bonjour,

je travaille sur un fichier pdf avec pdftk, et afin d'alléger le fichier créé je voudrais supprimer certaines lignes inutiles qui définissent des objets vides dans le document.

Le pdf contient des infos de la forme:

1 0 obj 
<<
/Matrix [1 0 0 1 0 0]
/Subtype /Form
/Filter /FlateDecode
/Length 18
/Resources 
<<
/ProcSet [/PDF /Text /ImageB /ImageC /ImageI]
>>
/FormType 1
/BBox [0 0 155.91 18.43]
/Type /XObject
>>
stream
ChaineDeCaracteres
endstream 
endobj 
2 0 obj 
<<
/Matrix [1 0 0 1 0 0]
/Subtype /Form
/Filter /FlateDecode
/Length 18
/Resources 
<<
/ProcSet [/PDF /Text /ImageB /ImageC /ImageI]
>>
/FormType 1
/BBox [0 0 26.08 18.43]
/Type /XObject
>>
stream
ChaineDeCaracteres
endstream 
endobj
3 0 obj 
<<
/Matrix [1 0 0 1 0 0]
/Subtype /Form
/Filter /FlateDecode
/Length 18
/Resources 
<<
/ProcSet [/PDF /Text /ImageB /ImageC /ImageI]
>>
/FormType 1
/BBox [0 0 22.96 18.43]
/Type /XObject
>>
stream
AutreChaineAGarder
endstream 
endobj

Je voudrais donc faire un truc du genre, si la ligne comprise entre stream et endstream contient ChaineDeCaracteres, alors supprimer les 15 lignes précédente et les 2 lignes suivantes.

Avec grep -B15 -A2 ChaineDeCaracteres j'arrive à afficher ce que je voudrais supprimer mais je voudrais afficher l'inverse.

Si quelqu'un a une idée.

Dernière modification par vincentp010 (Le 06/07/2009, à 18:37)


Desktop: Archlinux OpenBox
Laptop: Dualboot Ubuntu-Studio 9.10 / Archlinux OpenBox
Server: EeeBox Ubuntu-Server 8.10 500Go

Hors ligne

#2 Le 02/07/2009, à 15:56

Ferzed_

Re : [bash]supprimer n lignes avant expression [Résolu]

si tu veux l inverse d une expression grep, utilise l option :

-v, --invert-match
              Invert the sense of matching, to select non-matching lines.  (-v
              is specified by POSIX.)

#3 Le 02/07/2009, à 16:23

vincentp010

Re : [bash]supprimer n lignes avant expression [Résolu]

Merci de ta réponse, mais ça ne marche pas avec les options -A et -B.


Desktop: Archlinux OpenBox
Laptop: Dualboot Ubuntu-Studio 9.10 / Archlinux OpenBox
Server: EeeBox Ubuntu-Server 8.10 500Go

Hors ligne

#4 Le 02/07/2009, à 16:47

Ferzed_

Re : [bash]supprimer n lignes avant expression [Résolu]

Oui desole, apres avoir poste je me suis dis que je devais quand meme tester...  et effectivement ca ne fonctionne pas hmm

#5 Le 02/07/2009, à 17:31

Totor

Re : [bash]supprimer n lignes avant expression [Résolu]

Bonjour,

Voici une solution :

#!/bin/bash
total=0
FICHIER=fichier.txt
while read numLigne
do
  delLigne=$((${numLigne}-${total}))
  sed -i "$((${delLigne}-15)),$((${delLigne}+2)) d" "${FICHIER}"
  total=$((${total}+18))
done < <(awk ' /stream/ {stream=1} /endstream/ {stream=0} /ChaineDeCaracteres/ && stream==1 { print NR } '  "${FICHIER}")

mais attention, cette solution effectue la suppression directement dans le fichier source.
Effectue une copie avant de le lancer !

Dernière modification par Totor (Le 02/07/2009, à 17:32)


-- Lucid Lynx --

Hors ligne

#6 Le 06/07/2009, à 18:36

vincentp010

Re : [bash]supprimer n lignes avant expression [Résolu]

Merci bien ça marche.
J'avais commencé à écrire une boucle du genre, mais tu as répondu avant que je finisse.
J'aurais juste une question:
A quoi ça sert de mettre /stream/ {stream=1} /endstream/ {stream=0} et && stream==1 dans awk ?


Desktop: Archlinux OpenBox
Laptop: Dualboot Ubuntu-Studio 9.10 / Archlinux OpenBox
Server: EeeBox Ubuntu-Server 8.10 500Go

Hors ligne

#7 Le 06/07/2009, à 19:49

Totor

Re : [bash]supprimer n lignes avant expression [Résolu]

vincentp010 a écrit :

Merci bien ça marche.
J'avais commencé à écrire une boucle du genre, mais tu as répondu avant que je finisse.
J'aurais juste une question:
A quoi ça sert de mettre /stream/ {stream=1} /endstream/ {stream=0} et && stream==1 dans awk ?

A n'afficher le n°de ligne (print NR) que si chaineDeCaracteres est bien encadrée par stream et endstream (c'est le cas si stream=1)
Mais tu peux enlever tout cela si c'est forcément le cas (ce dont je ne savais pas)


-- Lucid Lynx --

Hors ligne