![]() |
|
|
Google unix.com
|
|||||||
| Foren | Registrieren | Forum-Regeln | Links | Alben | FAQ | Benutzerliste | Kalender | Suche | Die heutige Beiträge | Alle Foren als gelesen markieren |
| Shell Programmierung und Scripting Post Fragen zu ksh, csh, sh, bash, Perl, PHP, sed, awk und anderen Shell-Skripte und Shell-Scripting-Sprachen hier. |
Mehr UNIX-und Linux-Forum Themen Vielleicht finden Sie hilfreiche
|
||||
| Faden | Thread Starter | Forum | Antworten | Last Post |
| sed: Spiel finden und löschen Sie die Zeile oben | cstovall | Shell Programmierung und Scripting | 3 | 07-02-2008 11:31 PM |
| Perl: Match eine Linie mit mehreren Suchmuster | Juha | Shell Programmierung und Scripting | 10 | 04-09-2008 02:43 AM |
| Mehrere Linie mit der Benutzung von sed | SiftinDotCom | Shell Programmierung und Scripting | 15 | 03-28-2008 02:12 PM |
| lesen und mit mehreren Zeilen in Perl | zx1106 | Shell Programmierung und Scripting | 5 | 03-14-2008 10:21 PM |
| sed - Ersetzen Sie die Zeile enthält die Mustervergleich mit einer neuen Zeile | kousikan | Shell Programmierung und Scripting | 2 | 03-24-2007 07:24 AM |
![]() |
|
|
LinkBack | Thread Tools | Suche diesen Thread | Rate Thread | Anzeige-Modi |
|
|
|
||||
|
Hallo Experten, Ich bin Neuling auf perl, Einfach nur neugierig zu wissen, wie die folgenden im perl. Angenommen, ich ve eine TXT-Datei wie unten. wenn sie gründet "* Main Start" Dann gehen Sie zu "* Main Ende ,,,,,,,," patteren sammeln und nur die Anzahl der vorherigen Zeile "* Main Ende ,,,,,,," Muster. In meinem Fall ist es 5. Dann starten Sie excuting der Regel aus dem "* Main Start" Position Im Anschluss ist das Bild .. Ich möchte nicht zu einer temp-Datei auch .. Input-Datei: 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,,,,,,,, Ausgang: Code:
*Init End *Main Start repeat(5); process all lines as usual here. ............ *Main End,,,,,,,,, I ve, um alle Zeilen wie es ist, wenn es eine Zeile, die mit *. Thats, warum ich wie unten 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; Jede Hilfe die meisten geschätze .. Grüße, user_prady Zuletzt bearbeitet von user_prady; am 03-28-2008 12:51 AM.. |
|
||||
|
Ist es nicht möglich!
Zitat:
Danke Zuletzt bearbeitet von user_prady; am 03-30-2008 11:07 AM.. |
|
||||
|
Hängen nicht von mir, ich muss gehen zurück zu meinem Job bald. Es gibt eine Reihe von Möglichkeiten, dies zu tun, natürlich. Die altmodische Variante wäre zu erinnern, der vorherigen und drucken, wenn Sie sehen, den Terminator. Die wirklich Brute Perl Ansatz wäre, schlürfen die gesamte Datei und ersetzen alles, was mit einem leeren String mit Ausnahme der Linie vor dem Terminator. Es ist eine in der Perl FAQ zu diesem; perlfaq6 und blättern Sie um und damit zusammenhängende Fragen. (Die Frage nach der C Bemerkungen weiter unten die Seite ein paar Tips geben.) Aber die "vorherige Zeile"-Lösung ist die einfachste in diesem Fall, wenn Sie keine weiteren Anforderungen. Code:
perl -ne 'BEGIN { $matching = 0; }
$matching = 1 if (m/^\*Main Start/);
next unless $matching;
print $prev if (defined $prev && m/^\*Main End/);
$prev = $_'
Sie sind sich nicht sicher über die Flow Control Sie haben versucht zu beschreiben. Sind Sie soll daran erinnern alles vom Hauptbahnhof starten, bis Ende wichtigsten und drucken, dass nach der Ausgabe der letzten Zeile vor dem Haupt-Ende? (Ich vermute, diese bereits qualifiziert als Pseudo-Code-Implementierung von dem, was es braucht. Aber dann würde ich vielleicht eine regex substitution über die gesamte Datei, oder jeder * Main Start Abschnitt, nach dem alle.) Zuletzt bearbeitet von ERA; 03-30-2008 auf 07:22 AM.. Grund: Fügen Sie ein Perl-Snippet für die Erinnerung an vorherige Zeile |
|
||||
|
Zitat:
|
|
||||
|
Ich glaube nicht, dass ich gerade gemacht haben alle Ihre Anforderungen korrekt, aber zumindest ist es ein Anfang. Wenn ich zu erraten, was wäre am einfachsten ist, sammeln die Ausgabe in einer Variable und drucken Sie es aus, nachdem Sie gesehen haben * Main End und ausgedruckt die Linie, die unmittelbar vor ihr.
|
|
||||
|
wie es in Perl
Zitat:
Ich versuche zu tun, die in folgenden perl Code:
nawk ' {
if($0 ~ /^\*Main Start/){
while( $0 !~ /^\*Main End/){
print $0;
getline;
}
}
} ' my.txt
Ein weiterer Code möchte ich es in perl Bitte geben Sie mir einige grundlegende Idee, wie es geht, ohne dass Sie alle temporären Dateien .. 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 Zuletzt bearbeitet von user_prady; am 03-31-2008 02:48 AM.. |
![]() |
| Lesezeichen |
| Tags |
| perl, perl regex, perl Verschiebung, regex, Schicht, Verlagerung perl, solaris |
| Thread Tools | Suche diesen Thread |
| Anzeige-Modi | Rate this thread |
|
|