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 :

Seulement les lignes entres 2 expressions ( Avec / )


Sujet :

Shell et commandes GNU

  1. #1
    Membre expérimenté Avatar de Ivelios
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juillet 2008
    Messages
    1 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 031
    Points : 1 540
    Points
    1 540
    Par défaut Seulement les lignes entres 2 expressions ( Avec / )
    Bonjour à tous,

    Mon problème n'en ai plus vraiment un puisque j'ai trouvé une solution subsidiaire. Mais il me reste quelques interrogations à éclaircir sur la command sed.

    Voila l'histoire. J'ai un fichier trié contenant une URL par ligne. Je souhaite récupérer les URL entre l'URL $1 et $2. $1 et $2 sont fournies par l'utilisateur et contiennent le caractère "/" puisque ce sont des URLs.

    La commande sed '/$1/,/$2/p' permet de faire ça très bien... Sauf qu'il y a les "/". Et sous cette forme de sed je n'ai pas réussi à utiliser un autre caractère que "/" dans la commande ( sed '_$1_,_$2_p' ne marche pas ) Le pourquoi du comment, si vous avez la réponse?

    Donc L'autre solution est de modifier les "/" de $1 et $2 par des "\/"
    Puis d'appliquer notre sed '/$1/,/$2/p'. Mais ça fait un peu moche je trouve ( Et étrangement ça ne fonctionne plus dans mon petit script cf plus bas )
    Ou alors avec un awk un peu long... mais la aussi pourquoi utiliser awk alors qu'une command sed existe déjà

    Avez vous déjà été confronté à cette situation? Comment utiliser la commande sed avec des "/" sous cette forme? Y a t'il plus simple?

    Un petit script qui illustre le problème :
    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
    #!/bin/bash 
     
    data=`echo -e "t/1
    t/2
    t/3
    t/4
    t/5
    t/6
    t/7"`
    echo "$data"
     
    echo -e "sed between t/3 and t/5 without var ( t\/3 & t\/5)"
    echo "$data" | sed -n '/t\/3/,/t\/5/p'
     
    t3="t/3"
    t5="t/5"
    echo -e "sed between $t3 and $t5 with original var"
    echo "$data" | sed -n "/$t3/,/$t5/p"
     
    echo "sed between $t3 and $t5 with temp var ( replace / by \/ )" 
    e3=`echo "$t3" | sed -e 's_/_\\\/_g'`
    e5=`echo "$t5" | sed -e 's_/_\\\/_g'`
    echo "temp var : $e3"	
    echo "temp var : $e5"	
    echo "$data" | sed -n -e "/$e3/,/$e5/p"
     
    echo -e "awk between $t3 and $t5 with var"
    echo "$data" | awk -v t3=${t3} -v t5=${t5} -v show="" '$0==t3 {show++} show {print} $0==t5 {show=""}'
    En vous remerciant.

    ps : Je débute en shell, si vous avez d'autres remarques n'hésitez pas.
    Il était une fois [...] Et ils vécurent heureux et eurent beaucoup d'enfants!

  2. #2
    Expert éminent

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 946
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 946
    Points : 6 276
    Points
    6 276
    Par défaut
    Salut,

    Il faut modifier le délimiteur par défaut :

    $ man woman
    Il n'y a pas de page de manuel pour woman.

  3. #3
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 286
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 286
    Points : 12 742
    Points
    12 742
    Par défaut
    Bonjour,

    Il faut modifier le délimiteur par défaut :
    C'est un peu ce qu'il a voulu faire avec son expression:
    sed '_$1_,_$2_p'
    Donc, la petite explication, comme expliqué dans le man:
    \cregexpc
    Match lines matching the regular expression regexp. The c may be any character.
    Pour redéfinir le délimiteur, il faut employer "\".
    On a tendance à faire l'erreur a cause de la façon de faire avec la commande s de sed (entre autre).
    Cordialement.

  4. #4
    Membre expérimenté Avatar de Ivelios
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juillet 2008
    Messages
    1 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 031
    Points : 1 540
    Points
    1 540
    Par défaut
    Bonjour,

    Effectivement, c'était bien indiqué dans le man. Merci à vous.

    Par contre le "The c may be any character." me dérange.
    Les caractères '#' et '|' fonctionnent mais pas 'a' ou '_'. Il y a une explication à ça?
    sed: -e expression n°1, caractère 5: expression régulière d'adresse inachevée
    Il était une fois [...] Et ils vécurent heureux et eurent beaucoup d'enfants!

  5. #5
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 101
    Points : 5 849
    Points
    5 849
    Par défaut
    Citation Envoyé par Ivelios Voir le message
    Par contre le "The c may be any character." me dérange.
    Les caractères '#' et '|' fonctionnent mais pas 'a' ou '_'. Il y a une explication à ça?
    En effet, le 'c' peut effectivement être n'importe quel caractère... sauf que, pour un caractère 'c' donné, si ce caractère apparaît dans '$1' ou '$2', il faut qu'il y soit quoté (précédé d'un backslash)!
    Je ne serais pas surpris qu'il y ait des 'a' (le premier caractère de l'alphabet) ou des '_' (le caractère underscore) dans tes URLs, ce qui va forcément perturber ce pauvre sed!

    Si tu veux un code robuste qui s'adapte à tous les cas possibles, il faut faire exactement comme tu as fait (a priori 2 backslashes suffisent (pas besoin de quoter le slash)):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    e3=$(echo "${t3}" | sed -e 's_/_\\/_g')
    ou bien, pour un caractère 'c' donné:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    c='_'
    e3=$(echo "${t3}" | sed -e "s:${c}:\\\\${c}:g") # si ${c} est choisi différent de ':'
    ...
    echo "$data" | sed -n -e "\\${c}${e3}${c},${c}${t5}${c}p"
    PS: le nombre de backslashes est souvent un souci...
    il y a ceux qui servent au shell pour constituer la chaine lorsqu'on utilise les guillemets, puis ceux qui servent à sed...

  6. #6
    Membre expérimenté Avatar de Ivelios
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juillet 2008
    Messages
    1 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 031
    Points : 1 540
    Points
    1 540
    Par défaut
    Je ne serais pas surpris qu'il y ait des 'a' (le premier caractère de l'alphabet) ou des '_' (le caractère underscore) dans tes URLs, ce qui va forcément perturber ce pauvre sed!
    Pour le coup, le "a" et le "_" ne marchaient pour une autre raison. Qui m'a fait tilt quand j'ai lu ton code.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    echo "$data" | sed -n -e "\a${t3}a,\a${t5}ap" ->DONE
    echo "$data" | sed -n -e "\a$t3a,\a$t5ap" ->FAILED
    Merci pour les explications
    Il était une fois [...] Et ils vécurent heureux et eurent beaucoup d'enfants!

  7. #7
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 101
    Points : 5 849
    Points
    5 849
    Par défaut
    De l'utilité des accolades pour éviter les surprises et les arrachages de ch'veux!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 14
    Dernier message: 11/02/2015, 10h37
  2. Réponses: 2
    Dernier message: 01/07/2014, 17h14
  3. Lire les lignes d'un fichier avec csh
    Par nicolas581 dans le forum Linux
    Réponses: 4
    Dernier message: 24/03/2010, 16h38
  4. Réponses: 8
    Dernier message: 02/03/2007, 16h37

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