![]() |
|
|
google unix.com
|
|||||||
| Forums | Registreer | Forum Regels | Links | Albums | Veelgestelde vragen | Ledenlijst | Kalender | Zoeken | Today's Posts | Markeer forums als gelezen |
| Programmeren en Shell Scripting Post vragen over KSH, CSH, SH, Bash, Perl, PHP, sed, awk en andere shell scripts en shell scripting talen hier. |
Meer UNIX en Linux Forum Onderwerpen Misschien vindt u Helpful
|
||||
| Draad | Thread Starter | Forum | Antwoorden | Last Post |
| sed: find match en verwijdert u de bovenstaande regel | cstovall | Programmeren en Shell Scripting | 3 | 07-02-2008 11:31 PM |
| Perl: Match een lijn met meerdere patronen zoeken | Juha | Programmeren en Shell Scripting | 10 | 04-09-2008 02:43 |
| Meerdere lijn match gebruik van sed | SiftinDotCom | Programmeren en Shell Scripting | 15 | 03-28-2008 02:12 PM |
| lezen en match meerdere lijnen in perl | zx1106 | Programmeren en Shell Scripting | 5 | 03-14-2008 10:21 PM |
| sed - Vervang Line bevat de Pattern match met een nieuwe lijn | kousikan | Programmeren en Shell Scripting | 2 | 03-24-2007 07:24 |
![]() |
|
|
LinkBack | Thread Tools | Zoeken in deze Thread | Rate Thread | Display Modes |
|
|
|
||||
|
Hallo deskundigen, Ik ben newbie aan perl, Gewoon nieuwsgierig om te weten hoe je het volgende in perl. stel ik heb een txt bestand, zoals hieronder. wanneer het sticht "* Belangrijkste Start" Ga vervolgens naar "* Belangrijkste Einde ,,,,,,,," patteren en net verzamelt de nummer uit de vorige regel van "* Belangrijkste Einde ,,,,,,," patroon. In mijn geval is het 5. Dan beginnen excuting normaal gesproken uit de "* Belangrijkste Start" positie Hieronder de foto .. I dont wilt maken een tijdelijk bestand ook .. Input file: 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,,,,,,,, output: Code:
*Init End *Main Start repeat(5); process all lines as usual here. ............ *Main End,,,,,,,,, Ik heb voor het afdrukken van alle lijnen zoals het is als het vinden een lijn die begint met *. Dat is waarom ik doe zoals hieronder 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; Alle hulp meest gewaardeerd .. groeten, user_prady Laatst bewerkt door user_prady; op 03.28.2008 12:51 AM.. |
|
||||
|
Is het niet mogelijk!
Citaat:
Bedankt Laatst gewijzigd door user_prady; op 03.30.2008 11:07.. |
|
||||
|
Zijn niet afhankelijk van mij, ik moet terug te gaan naar mijn dagelijks werk binnenkort. Er is een aantal manieren om dit te doen, natuurlijk. De ouderwetse variant zou zijn om te onthouden de vorige regel en print dat wanneer je de terminator. De echt bruut Perl aanpak zou zijn om Slurp het hele bestand en vervangingstechnologieën alles met een lege string met uitzondering van de regel vóór de terminator. Er is een in de Perl Veelgestelde vragen over; perlfaq6 en ga rond voor vragen. (De vraag over C opmerkingen verderop in de pagina heeft een aantal tips, too.) Maar de "vorige regel" oplossing is absoluut de eenvoudigste in dit geval, als u geen verdere eisen. Code:
perl -ne 'BEGIN { $matching = 0; }
$matching = 1 if (m/^\*Main Start/);
next unless $matching;
print $prev if (defined $prev && m/^\*Main End/);
$prev = $_'
Niet zeker over de flow control u probeerde te beschrijven. Bent u te onthouden van alles belangrijkste begin tot eind belangrijkste en print dat na de output van de laatste regel vóór belangrijkste einde? (Ik denk dat dit reeds in aanmerking komt als een pseudo-code uitvoering van wat er nodig is. Maar dan zou ik misschien overwegen een regex substitutie over het hele dossier, of van iedere * Main Start afdeling, na alles.) Laatst gewijzigd door tijdperk; op 03.30.2008 07:22.. Reden: Voeg een Perl fragment voor het herdenken van vorige regel |
|
||||
|
Citaat:
|
|
||||
|
Ik denk niet dat ik gevangen al uw eisen correct maar het is tenminste een begin. Als ik mag raden, wat zouden makkelijkste is het verzamelen van de output in een variabele en afdrukken nadat u hebt gezien * Belangrijkste End en uitgeprint de lijn die onmiddellijk voorafgegaan is.
|
|
||||
|
hoe dat te doen in perl
Citaat:
Ik probeer te doen follwoing in perl Code:
nawk ' {
if($0 ~ /^\*Main Start/){
while( $0 !~ /^\*Main End/){
print $0;
getline;
}
}
} ' my.txt
Een code die ik heb willen doen in perl pls geef me een idee hoe dat te doen zonder dat dit leidt tot een tijdelijke bestanden .. 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
Thanks & Regards, user_prady Laatst gewijzigd door user_prady; op 03.31.2008 02:48.. |
![]() |
| Bladwijzers |
| Labels |
| perl, Perl regex, perl verschuiving, regex, verschuiven, verschuiving perl, solaris |
| Thread Tools | Zoeken in deze Thread |
| Display Modes | Beoordeel deze draad |
|
|