Récupération de chaîne en bash

[Résolu/Fermé]
Signaler
-
Messages postés
30137
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
28 septembre 2021
-
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

Messages postés
30137
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
28 septembre 2021
7 176
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://www.commentcamarche.net/faq/5027-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
Messages postés
40805
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 882
Surement le "{//d;p}" ;-(
Messages postés
40805
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 882
Essaie comme ça :

sed -n '/P18/,/C04/{/P18/b;/C04/b;p}'
ça marche aussi niquel merci beaucoup. Vous pourriez m'expliquer la ligne s'il vous plaît?
Messages postés
40805
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 882
/P18/,/C04/
Plage/Intervalle d'adresses sur lesquelles porteront les commandes

{
Regroupement de commandes devant s'appliquer au motif

/P18/b
Quand le motif est rencontré, se brancher (commande "b") à la fin du script. En d'autres termes, ne pas appliquer les commandes à ce motif.

/C04/b
Idem que précédemment.


p
Commande print (affichage). On affiche sur la sortie standard les lignes correspondant au motif.


}
Fin du regroupement de commandes.
Ok merci beaucoup
Messages postés
30137
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
28 septembre 2021
7 176
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.
Messages postés
40805
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 882
Un peu de lecture pour les chaudes soirées d'été ;-))
Messages postés
30137
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
28 septembre 2021
7 176
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).
Messages postés
40805
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 882
;-))

Tu me la sors plus simple avec "awk" s'teuplé ;-))
Messages postés
30137
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
28 septembre 2021
7 176
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