#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
#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]
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