Forum Programmation.shell Comment afficher du texte d'un fichier situé entre caractères spéciaux.

Posté par  .
Étiquettes : aucune
0
10
mai
2006
Bonjour a tous,
voici mon problème, dans un même répertoire, j'ai plusieurs fichiers .txt dans lesquels j'ai par exemple ceci :

------------------------------------------------
Titre : incident serveur
Com : Explique comme résoudre le probleme maj RF530
blablablablala

?
Ceci est l'explication pour résoudre le problème
blablablablablablablablblablablablablablablabl
blablablablablablablablblablablablablablablabl
blablablablablablablablblablablablablablablabl
?
----------------------------------------------

Le but du 'jeu' c'est qu'en executant le script avec une variable du style :
./script serveur
que ca scan les .txt et ne m'affiche QUE le texte situé entre le ? et le ?

J'ai lu un post concernant presque la même manip et je suis tombé sur :
sed '/\*{/,/\*}/ s/\*.*//g' nom_fichier | grep -v '^$' >nouveau_fichier

mais ca ne fonctionne pas.

De plus j'ai deja fait ça :
find . -name "*.txt" -type f -exec grep -in $1 {} /dev/null \; | cut -d":" -f1 | cut -d"/" -f2 | sort -u > txt_liste

ca me donne un fichier dans lequel j'ai les noms de fichiers dont l'occurence est présente, ensuuite j'ai ça :

#! /bin/bash
for file in $(cat txt_liste)
do
cat $file
done

mais c'est pas complet, forcement. je pense que le SED devrais se trouver la, et bien sur a terme les 2 scripts ne feront plus qu'un.

J'espère mettre bien fait comprendre.
Merci beaucoup.
  • # m'être

    Posté par  . Évalué à 2.

    On dit j'espère m'être fait bien comprendre.
    Et non je ne ferais pas le jeu de mot avec mettre et ce que tu peux faire avec ;)
    Mais phonetiquement oui, on a bien compris que tu veux qu'on te fasse ton script.
    • [^] # Re: m'être

      Posté par  . Évalué à -2.

      ton post est inutile, merci de garder propre mes posts et d'effacer tes reflexions personnelles.

      merci.
  • # FAQ sed

    Posté par  . Évalué à 2.

    je pense que http://sed.sourceforge.net/sedfaq4.html#s4.24 pourra t'aider

    Dam
  • # quelques pistes pour t'aider ...

    Posté par  . Évalué à 3.

    D'abord, dans un répertoire, il n'est pas nécessaire de faire un find: tu fais une boucle for:

    for i in *.txt
    do
    echo "$i"
    done

    Essaie, tu verras ce que ça fait.

    Ensuite pour ce que tu veux faire, awk est ton ami. Seulement faut lui dire un petit truc avant de commencer: pour information, awk traite des enregistrement composés de champs. Les enregistrement sont séparés par un séparateur d'enregistrement qui est le retour chariot par défaut (c'est pour ça que par défaut, awk traite des lignes). Nous on va lui dire de traiter des "lignes séparées non pas par un retour chariot mais par un "?", ce qui donne:

    for i in *.txt
    do
    awk 'BEGIN{ RS="?" } {if (NR==2){print $0}}' $i done


    En espérant que ça e convienne ...

    NB: je t'ai aidé parce que j'ai vu que tu as un peu cherché.
    • [^] # Re: quelques pistes pour t'aider ...

      Posté par  . Évalué à 1.

      je te remercie vivement, effectivement j'ai cherché mais en sachant qu'il y a 3 mois je ne connaissais rien en linux
      (ou presque), et je dois avoir 10 crous de VBA dans les pattes, pour te donner mon niveau.

      Mais j'ai la logique de code, et c'est ça le plus important, quoi qu'il en soit, merci pour ton aide, j'étais parti sur du awk
      effectivement mais j'avoue avoir quelques problèmes avec les expressions régulière.

      Merci encore pour ton aide.
  • # Imprécis

    Posté par  . Évalué à 2.

    que ca scan les .txt et ne m'affiche QUE le texte situé entre le ? et le ?
    Ahlala, cette foutue manie de poser des questions imprécises : tu ne dis pas ce que tu veux faire des '?'.

    $ cat tst
    ------------------------------------------------
    Titre : incident serveur
    Com : Explique comme résoudre le probleme maj RF530
    blablablablala

    ?
    Ceci est l'explication pour résoudre le problème
    blablablablablablablablblablablablablablablabl
    ?
    ------------------------------------------------
    Titre : incident serveur
    Com : Explique comme résoudre le probleme mAj RF530
    blAblAblAblAlA

    ?
    Ceci est l'explicAtion pour résoudre le problème
    blAblAblAblAblAblAblAblblAblAblAblAblAblAblAbl
    ?
    ------------------------------------------------
    $ sed '/^?$/,/^?$/!d;/^?$/d' tst
    Ceci est l'explication pour résoudre le problème
    blablablablablablablablblablablablablablablabl
    Ceci est l'explicAtion pour résoudre le problème
    blAblAblAblAblAblAblAblblAblAblAblAblAblAblAbl


    Mais j'imagine que tu veux un séparateur...
    • [^] # Re: Imprécis

      Posté par  . Évalué à 0.

      je pense avoir été précis, en effet ce sont des séparateurs, et comme j'ai dis que je voulais que ça n'affiche QUE ce qu'il y a entre ? et ?, forcement les ?, on le les affiche pas.
  • # Voici donc la réponse :

    Posté par  . Évalué à 0.

    J'ai eu besoin de creer un CGI-BIN
    Voici donc la page HTML qui le suporte :
    --------------------------------------------------------------------------
    <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
    <HTML VERSION="2.0">
    <HEAD>
    <TITLE>Recherche d'occurrences dans les fichiers textes</TITLE>
    </HEAD>
    <BODY BGCOLOR="#FFFFFF">
    <table border=0 width=100%>
    <tr>
    <P><td align=left valign=middle></P>
    <P><B><FONT SIZE="6">Direction Informatique</FONT></B></P>
    <P><B><FONT SIZE="4">Recherche d'occurrences dans les fichiers textes</FONT></B></P>
    <P></td><td align=right valign=middle></P>
    <P ALIGN="RIGHT"><IMG SRC=file:///W:/cgi-bin/dslogo.gif ALIGN="TOP" WIDTH="170" HEIGHT="60" ></P>
    <P></td>
    </tr>
    </table></P>
    <H1><FONT SIZE="2"><A HREF="/index.html">[Accueil]</FONT></A></H1>
    <HR>
    <FORM METHOD="POST" ACTION="http://infotst.dsp.ds/cgi-bin/recherche/cherche.cgi">
    <P><INPUT TYPE="TEXT" NAME="chaine" SIZE="25"></P>
    <P><INPUT TYPE="SUBMIT" NAME="recherche" VALUE="Recherche"><B> </B>
    <INPUT TYPE="RESET" NAME="annule" VALUE="Annule"></P>
    </FORM>
    <HR>
    <TABLE ALIGN=ABSCENTER CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
    </TABLE>
    </BODY>
    </HTML>
    --------------------------------------------------------------------------

    Et voici le CGI-BIN :

    --------------------------------------------------------------------------
    #! /bin/sh
    umask 002
    echo Content-type: text/html
    echo
    echo '<FONT >'
    echo '<H2><TT>'
    PATH=":/srv/www/cgi-bin:"$PATH ; export PATH
    info=`cat - `
    info=`echo $info | tr '&' ' ' `
    for i in `echo $info `
    do
    cmd=`echo $i | cut -f1 -d= `
    par=`echo $i | cut -f2 -d= `
    case $cmd in
    chaine ) chaine=$par ;;
    file ) file=$par ;;
    esac
    done
    echo "You are looking for occurrence : $chaine"
    echo '<BR>'
    # le code
    a=`find . -name "*.txt" -type f -exec grep -in $chaine {} /dev/null \; | cut -d":" -f1 | cut -d"/" -f2 | sort -u`
    echo "File(s) where occurrence were found : $a"
    echo '<BR>'
    for i in $a
    do
    echo '<BR>'
    echo "Result : "
    echo '<BR>'
    awk 'BEGIN { RS="?" } NR==2' $i
    echo '<BR>'
    done
    echo '</TT></H2>'
    echo ' </FONT>'

    --------------------------------------------------------------------------

    ca marche impec !
    A+++

Suivre le flux des commentaires

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n’en sommes pas responsables.