The UNIX and Linux Forums  


Go Back   Les systèmes UNIX et Linux Forums > Top Forums > De programmation et de script Shell
.
google unix.com



De programmation et de script Shell Posez vos questions à propos de KSH, CSH, SH, BASH, PERL, PHP, SED, awk et d'autres scripts shell et les langages de script shell ici.

Plus d'UNIX et Linux Forum Sujets Vous trouverez peut-être utile
Fil Thread Starter Forum Réponses Last Post
sed: match trouver et de supprimer la ligne ci-dessus cstovall De programmation et de script Shell 3 07-02-2008 11:31 PM
Perl: Match d'une ligne avec plusieurs modes de recherche Juha De programmation et de script Shell 10 04-09-2008 02:43 AM
Multiples en utilisant la ligne match sed SiftinDotCom De programmation et de script Shell 15 03-28-2008 02:12 PM
lire et faire correspondre plusieurs lignes en perl zx1106 De programmation et de script Shell 5 03-14-2008 10:21 PM
sed - remplacer la ligne qui contient le Pattern match avec une nouvelle ligne kousikan De programmation et de script Shell 2 03-24-2007 07:24 AM

Closed Thread
English Japanese Spanish French German Portuguese Italian Dutch Swedish Russian Norwegian Hungarian Hebrew Danish Bulgarian Greek Powered by Powered by Google
 
LinkBack Thread Tools Recherche sur ce Thread Rate Thread Modes d'affichage
  #1 (permalink)  
Old 03-27-2008
user_prady user_prady is offline
Registered User
  
 

Join Date: Sep 2007
Messages: 163
Unhappy si match aller à trouver une ligne en perl

Bonjour experts,

Je suis débutant à perl, Tout simplement curieux de savoir comment effectuer les opérations suivantes dans perl.
supposons que j ai un fichier txt comme ci-dessous. quand il fonde "* Main Start"
Ensuite, allez à "* Principale Fin ,,,,,,,," patteren et de collecter le numéro de la ligne précédente de "* Principale Fin ,,,,,,," modèle. Dans mon cas, il est de 5. Puis commencez excuting normalement de la "* Main Start" position

Voici la photo .. Je ne voulez pas créer de fichier temporaire aussi ..
Fichier d'entrée:

Code:
*Init End
*Main Start
*Comment Reset Timers
000000,0000,0,0,0,0,0,1,0
000000,0000,0,0,0,0,1,1,0 
*Comment Control Frame at 1.04596 ms
000000,0400,0,0,0,0,1,0,1
2418A4,0000,0,1,3,0,0,0,0 
049C00,0000,0,0,2,0,0,0,0
*Comment Control Frame at 1.04673 ms
*Comment Control Frame at
000002,0000,0,0,0,0,1,0,1
241002,0000,0,1,3,0,0,0,0
000100,0000,0,0,2,0,0,0,0
*Comment Control Frame at
000004,0000,0,0,0,0,1,0,1
241002,0000,0,1,3,0,0,0,0
000000,0000,0,0,2,0,0,0,0
*Comment Frame 13 at ** us,,,,,,,,
000005,7E3D,0,0,0,0,1,0,1
*Main End,,,,,,,,

sortie:

Code:
*Init End
*Main Start
 repeat(5);
process all lines as usual here.

............
*Main End,,,,,,,,,

J ai l'impression que toutes les lignes, il est quand il a trouvé une ligne commençant par *. C'est pourquoi je fais comme ci-dessous

Code:
 if(m/^\*/){
              print "//", $_;
              next;
    }


Code:
Basic Algorithm of my programme need :
1. If "*Main Start" pattern found go to line where Pattern matches "*Main end".
2. Get the previous line. and get the value of the first field.
3. Return to "*Main start" position again. & Print repeat(that number) : in my case it is 5 :
4. stop/next;

Toute aide appriciated plus ..

observe,
user_prady

Dernière édition par user_prady; 03-28-2008 à 12:51 AM..
  #2 (permalink)  
Old 03-30-2008
user_prady user_prady is offline
Registered User
  
 

Join Date: Sep 2007
Messages: 163
N'est-il pas possible!

Citation:
Posté par user_prady View Post
Bonjour experts,

Je suis débutant à perl, Tout simplement curieux de savoir comment effectuer les opérations suivantes dans perl.
supposons que j ai un fichier txt comme ci-dessous. quand il fonde "* Main Start"
Ensuite, allez à "* Principale Fin ,,,,,,,," patteren et de collecter le numéro de la ligne précédente de "* Principale Fin ,,,,,,," modèle. Dans mon cas, il est de 5. Puis commencez excuting normalement de la "* Main Start" position

Voici la photo .. Je ne voulez pas créer de fichier temporaire aussi ..
Fichier d'entrée:

Code:
*Init End
*Main Start
*Comment Reset Timers
000000,0000,0,0,0,0,0,1,0
000000,0000,0,0,0,0,1,1,0 
*Comment Control Frame at 1.04596 ms
000000,0400,0,0,0,0,1,0,1
2418A4,0000,0,1,3,0,0,0,0 
049C00,0000,0,0,2,0,0,0,0
*Comment Control Frame at 1.04673 ms
*Comment Control Frame at
000002,0000,0,0,0,0,1,0,1
241002,0000,0,1,3,0,0,0,0
000100,0000,0,0,2,0,0,0,0
*Comment Control Frame at
000004,0000,0,0,0,0,1,0,1
241002,0000,0,1,3,0,0,0,0
000000,0000,0,0,2,0,0,0,0
*Comment Frame 13 at ** us,,,,,,,,
000005,7E3D,0,0,0,0,1,0,1
*Main End,,,,,,,,

sortie:

Code:
*Init End
*Main Start
 repeat(5);
process all lines as usual here.

............
*Main End,,,,,,,,,

J ai l'impression que toutes les lignes, il est quand il a trouvé une ligne commençant par *. C'est pourquoi je fais comme ci-dessous

Code:
 if(m/^\*/){
              print "//", $_;
              next;
    }


Code:
Basic Algorithm of my programme need :
1. If "*Main Start" pattern found go to line where Pattern matches "*Main end".
2. Get the previous line. and get the value of the first field.
3. Return to "*Main start" position again. & Print repeat(that number) : in my case it is 5 :
4. stop/next;

Toute aide appriciated plus ..

observe,
user_prady
Salut les amis, il est de toute façon de le faire. Pls help ..

Merci

Dernière édition par user_prady; au 03.30.2008 11:07 AM..
  #3 (permalink)  
Old 03-30-2008
ère era is offline Forum Advisor  
Inutile de Herder Cats (en congé sabbatique)
  
 

Join Date: Mar 2008
Location: / il / est / que / bin / sh
Messages: 3652
Ne dépendent pas de moi, j'ai besoin d'aller à mon poste de jour bientôt.

Il ya un certain nombre de moyens pour ce faire, évidemment. L'ancienne variante serait de se souvenir de la ligne et les imprimer quand vous voyez que le terminateur. La réalité brute Perl approche serait de boire l'ensemble du dossier et de substituer le tout avec une chaîne vide, sauf la ligne avant le terminateur. Il ya une heure dans le Perl FAQ à ce sujet; perlfaq6 et faites défiler autour de questions connexes. (La question sur les commentaires C plus bas sur la page a quelques pistes, aussi.)

Mais la "ligne" est tout à fait la solution la plus simple dans ce cas, si vous n'avez pas d'autres exigences.


Code:
perl -ne 'BEGIN { $matching = 0; }
  $matching = 1 if (m/^\*Main Start/);
  next unless $matching;
  print $prev if (defined $prev && m/^\*Main End/);
  $prev = $_'

Vous ne savez pas de contrôle sur les flux que vous avez essayé de les décrire. Êtes-vous censé rappeler tout début de la principale jusqu'à la fin principale et imprimer que, après la sortie de la dernière ligne principale avant la fin? (Je suppose que c'est déjà comme un pseudo-code de mise en œuvre de ce qu'il faut. Mais alors, peut-être que je voudrais examiner une regex de substitution sur l'ensemble du fichier, ou de début de chaque section principale *, après tout.)

Dernière édition par époque au 03.30.2008 07:22 AM.. Motif: Ajout d'un extrait de Perl pour se rappeler la ligne précédente
  #4 (permalink)  
Old 03-30-2008
user_prady user_prady is offline
Registered User
  
 

Join Date: Sep 2007
Messages: 163
Citation:
Posté par ère View Post
Ne dépendent pas de moi, j'ai besoin d'aller à mon poste de jour bientôt.

Il ya un certain nombre de moyens pour ce faire, évidemment. L'ancienne variante serait de se souvenir de la ligne et les imprimer quand vous voyez que le terminateur. La réalité brute Perl approche serait de boire l'ensemble du dossier et de substituer le tout avec une chaîne vide, sauf la ligne avant le terminateur. Il ya une heure dans le Perl FAQ à ce sujet; perlfaq6 et faites défiler autour de questions connexes. (La question sur les commentaires C plus bas sur la page a quelques pistes, aussi.)

Mais la "ligne" est tout à fait la solution la plus simple dans ce cas, si vous n'avez pas d'autres exigences.


Code:
perl -ne 'BEGIN { $matching = 0; }
  $matching = 1 if (m/^\*Main Start/);
  next unless $matching;
  print $prev if (defined $prev && m/^\*Main End/);
  $prev = $_'

Vous ne savez pas de contrôle sur les flux que vous avez essayé de les décrire. Êtes-vous censé rappeler tout début de la principale jusqu'à la fin principale et imprimer que, après la sortie de la dernière ligne principale avant la fin? (Je suppose que c'est déjà comme un pseudo-code de mise en œuvre de ce qu'il faut. Mais alors, peut-être que je voudrais examiner une regex de substitution sur l'ensemble du fichier, ou de début de chaque section principale *, après tout.)
Merci beaucoup pour votre gentillesse ère .. I ll tenter votre chemin .. mentionné
  #5 (permalink)  
Old 03-30-2008
ère era is offline Forum Advisor  
Inutile de Herder Cats (en congé sabbatique)
  
 

Join Date: Mar 2008
Location: / il / est / que / bin / sh
Messages: 3652
Je ne pense pas que j'ai capturé correctement à toutes vos exigences, mais au moins c'est un début. Si je suis autorisé à le deviner, ce qui serait plus facile de récupérer la sortie est dans une variable et de l'imprimer après avoir vu Fin * principale et imprimés de la ligne qui a immédiatement précédé.
  #6 (permalink)  
Old 03-31-2008
user_prady user_prady is offline
Registered User
  
 

Join Date: Sep 2007
Messages: 163
comment faire en perl

Citation:
Posté par ère View Post
Je ne pense pas que j'ai capturé correctement à toutes vos exigences, mais au moins c'est un début. Si je suis autorisé à le deviner, ce qui serait plus facile de récupérer la sortie est dans une variable et de l'imprimer après avoir vu Fin * principale et imprimés de la ligne qui a immédiatement précédé.
J'ai essayé presque tous les cours en utilisant prochain, et de refaire la dernière commande en perl Mais je ne peux pas obtenir ces syntaxe correcte dans perl. Je sais facile, mais je cant trouver le moyen efficace et tout en utilisant la prochaine déclaration perl.

J'essaie de faire de la follwoing perl


Code:
nawk ' {
        if($0 ~ /^\*Main Start/){
	     while( $0 !~ /^\*Main End/){
	     print $0;
             getline;
        }
     }
 } ' my.txt

Un code de plus je veux le faire en perl merci de me donner une idée comment le faire sans créer de fichiers temporaires ..


Code:
TMP=/tmp/my_tmp$$
nawk '
/\*Main End/{
split(x,arr,",")
print "Loop  " arr[1]
};
{x=$0
}
' my.txt > $TMP 

nawk '{
if($0 ~ /^Loop/){
    loop = $2 
    next;
  }
if($0 ~ /^\*Main Start/){
     printf "\nrepeat ("
     print  loop

} ' $TMP $my.txt


Merci & Regards,
user_prady

Dernière édition par user_prady; au 03.31.2008 02:48 AM..
Closed Thread

Bookmarks

Tags
perl, perl regex, perl changement, regex, déplacement, changement perl, solaris

Thread Tools Recherche sur ce Thread
Recherche sur ce Thread:

Recherche avancée
Modes d'affichage Rate this thread
Rate this thread:

Règles de messages
Tu mai pas de nouvelles discussions: nonoui
Tu mai pas envoyer des réponses:
Tu mai pas envoyer des pièces jointes
Tu mai pas modifier vos messages

BB code est Sur
Smilies sont Sur
[IMG] code est Sur
Le code HTML est Hors tension
Trackbacks sont Sur
Pingbacks sont Sur
Refbacks sont Sur




Toutes les heures sont au format GMT -4. Le temps est maintenant 05:30 AM.


Powered by: vBulletin, Copyright © 2000 - 2006, Jelsoft Enterprises Limited. Traductions Langue Powered by .
vBCredits v1.4 Copyright © 2007 - 2008, PixelFX Studios
Les systèmes UNIX et Linux Forums Content Copyright © 1993-2009. Tous droits Reserved.Ad de gestion par RedTyger

Content Relevant URLs par vBSEO 3.2.0