Récupération de chaîne en bash

Résolu/Fermé
marie78 - 1 juil. 2010 à 08:48
mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 - 1 juil. 2010 à 17:07
Bonjour,

J'aimerais savoir comment je peux récupérer des lignes entre deux autre lignes déja connu sans la commande sed en bash.

Par exemple jai comme fichier:
kefjkef
egfdg
rgtdrg

P18
,fdjkg
dfhgf
fghg

C04

dgrygtr
dfg

et je veux à la fin avoir que ce qu'il y a en dessous de P18 et au dessus de C04:
fichier final:

,fdjkg
dfhgf
fghg

Merci de votre aide

3 réponses

mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 7 749
Modifié par mamiemando le 1/07/2010 à 10:09
Tu peux lire le fichier ligne par ligne et quand tu arrives sur la ligne qui correspond au debut de section à extraire, entrer dans une boucle qui écrit au bon endroit les lignes à extraire jusqu'à rencontrer la ligne qui marque la fin de la zone à extraire.

https://forums.commentcamarche.net/forum/affich-37620017-comment-lire-un-fichier-ligne-par-ligne
http://www.laboiteaprog.com/article-70-3-bash_introduction

De toute façon sed n'aurait pas été le plus pratique pour ce que tu veux faire (voire n'aurait pas permis de le faire simplement). Je serais plutôt parti awk ou sur un script purement shell comme celui que je t'ai indiqué... sachant qu'en awk c'est plus facile à écrire.

Bonne chance
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 895
1 juil. 2010 à 10:20
Salut,

De toute façon sed n'aurait pas été le plus pratique pour ce que tu veux faire (voire n'aurait pas permis de le faire simplement)
Ben si justement, ça c'est son truc à "sed" :

sed -n '/P18/,/C04/{//d;p}'

Plus simple, tu meurs ;-))
0
Merci je vais essayer.
Oui je sais qu'avec sed ça aurait été plus simple jipicy, mais il ne veut pas me le faire sur une carte électronique, il me crée toujours un dossier vide, alors que si je le fais directement dans l'ordinateur ça marche. J'ai essayé pleins de truc, si je met une commande pour récupérer les dernière ligne avec tail ça marche très bien, mais avec sed ça marche pas du tout. Saurais tu pourquoi?
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 895
1 juil. 2010 à 11:02
Honnêtement non, je ne vois pas pourquoi ;-\

Et avec "ed" :

ed -s fichier  <<< $'/P18/+1,/C04/-2p\n'
0
Ceci m'a planté la console :-)!!Quand j'ai écrit la ligne ci dessus, il m'a d'abord dis redirection unexpected, dc j'ai enlevé une des flèches, et là au lieu d'avoir des $ pour écrire une autre ligne de commande, j'ai > et il prend plus aucune ligne de commande en compte
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 895
1 juil. 2010 à 11:14
Tape "q" pour quitter ou 'CTRL+D' si le "q" est inefficace ;-)
0
mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 7 749
Modifié par mamiemando le 1/07/2010 à 16:41
Ah effectivement jipicy je ne connaissais pas cette syntaxe (en fait je ne pensais pas que sed pouvait travailler sur un groupes de lignes, je croyais qu'il raisonnait ligne par ligne).

Merci pour ces précisions.
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 895
1 juil. 2010 à 16:48
Un peu de lecture pour les chaudes soirées d'été ;-))
0
mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 7 749
1 juil. 2010 à 16:53
Oulà je te remercie mais j'ai déjà plein d'autres choses à lire :-)

Et en général je travaille plutôt avec awk qui me permet d'en faire autant et pour moi plus simplement (sachant que j'ai pas mal développé dans ma jeunesse, je trouve l'approche plus simple).
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 895
1 juil. 2010 à 16:55
;-))

Tu me la sors plus simple avec "awk" s'teuplé ;-))
0
mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 7 749
1 juil. 2010 à 17:07
Comme ça :

script.awk

/C04/{
    extraire = 0
}

{
    if (extraire == 1){
        print $0;
    }
}

/P18/{
    extraire = 1
}


Certes c'est plus long à écrire mais je trouve ça plus clair et plus facile à généraliser ou à étendre. Enfin après chacun ses goûts, moi je trouve la syntaxe sed parfois peu parlante.

awk -f script.awk fichier.txt 
0