Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
woodpecker •--->
![•---> •--->](/phpBB2/images/ranks/ranki2.gif)
Anmeldedatum: 12.10.2010 Beiträge: 150 Wohnort: Roggentin/Rostock
|
Verfasst am: 19.11.2010 - 10:17 Titel: Handler zur Textanalyse und -verarbeitung |
|
|
Hallo,
ich habe ein paar Handler geschrieben, mit denen man sehr bequem Texte analysieren und verarbeiten kann. Sie basieren im Wesentlichen auf den Möglichkeiten, die das UNIX-Kommando awk bietet.
Im Einzelnen sind das die Funktionen:
Substr - Rückgabe eines Teilstrings
StrIndex - Ermittlung der Position eines regulären Ausdrucks innerhalb eines Textes
Match - Ermittlung von Position, Länge und Wert eines Matches
Substitute - Pattern-Substitution
PatternCount - Ermittlung der Anzahl Vorkommen eines Pattern im String
KeyString - Senden von Tastenanschlägen, die auch Umlaute enthalten können
Die meisten Funktionen arbeiten mit Here Documents für awk. Dabei ist es wichtig, dass in der Folgezeile des Kommandoaufrufs (d.h. dort, wo das Here Document beginnt) keine Leerzeichen am Zeilenanfang eingefügt werden. Die Zeichenfolge
muss also immer am Anfang der Zeile stehen, da sonst die am Zeilenanfang stehenden Leerzeichen Teil des Here Documents werden.
Der Handler KeyString arbeitet rekursiv. Er sendet alle Tastenanschläge bis zum ersten Umlaut, dieser wird dann einer Sonderbehandlung unterzogen und er ruft sich mit dem Reststring selber auf, solange wie noch Umlaute im Text vorhanden sind. Leider funktioniert es nicht, wenn mehrere Umlaute unmittelbar aufeinander folgen. Das werde ich aber noch mal untersuchen. Vielleicht weiss auch jemand, woran es liegt.
Ich habe das Skript als stringdll in meinem AppleScript-Verzeichnis gespeichert und lade es dann entsprechend mit
Code: |
set stringdll to load script file ((path to "docs" as string) & "AppleScript:stringdll.scpt")
|
Beispiele zu den Funktionsaufrufen sind im Quelltext angegeben.
Das ist der Code:
# Script : stringdll (AppleScript) Stand vom : Donnerstag, 18. November 2010 14:26:51 Uhr
# Autor : Erich Schmidt
# Regeln: Patternsuche geht nicht über Zeilengrenzen
# Ein Pattern darf kein Slash oder Newline enthalten
# Rueckgabe eines Teilstrings
# spos - Startposition, beginnend bei 1 (beschreibt die Startposition ein Zeichen ausserhalb
# des Strings, wird ein Leerstring zurückgegeben)
# len - Länge des Teilstrings, wenn positiv, beliebig gross
# wenn negativ und der Betrag der Länge ist grösser als die Anzahl der Zeichen im Text,
# wird die Länge 1 benutzt. Das gilt auch für eine Länge 0
on Substr(Txt, spos, len)
set Ntxt to number of Txt
if len is 0 or Ntxt + len is less than 0 then set len to 1
if spos is not greater than 0 or spos is greater than Ntxt then return ""
set lastc to spos + len - 1
if lastc is greater than Ntxt then set lastc to Ntxt
set subs to characters spos thru lastc of Txt as string
return subs
end Substr
# Position eines Pattern innerhalb eines Strings Txt
# Das Pattern kann ein beliebiger regulärer Ausdruck sein
# Es wird die Position des ersten Pattern innerhalb des Strings zurückgegeben
on |StrIndex|(Txt, pattern)
if |CheckPattern|(pattern) then
return 0
end if
set awk to "<<++ awk '/" & pattern & "/ { match($0,\"" & pattern & "\");n=RSTART ;s=1;nextfile}
{ idx += length+1 }
END {printf s ? idx+n : 0} '
" & Txt & "
++"
set rc to do shell script awk
return rc as number
end |StrIndex|
# Match eines Pattern in einem String Txt
# Es wird eine Liste zurückgegeben: {POSITION,LAENGE,MATCH}
#
# Beispiele: |Match| for "[X-Z][0-9]{1,2}" into "INDEX3567" ergibt {5, 3, "X35"}
# |Match| for " .*tag" into "Mittwoch Donnerstag" ergibt {9, 11, " Donnerstag"}
on |Match| for pattern into Txt
set NullMatch to {0, 0, ""}
if |CheckPattern|(pattern) then
return NullMatch
end if
set awk to "<<++ awk '/" & pattern & "/ { match($0,\"" & pattern & "\") ;s=1;line=$0;n=RSTART;nextfile }
{ idx += length+1 }
END { printf \"%d %d :%s\", s?idx+n:0,s?RLENGTH:0,substr(line,RSTART,RLENGTH) } '
" & Txt & "
++"
set rc to do shell script awk
if rc is equal to "" then return NullMatch
set Position to 1st word of rc as number
set Lengthx to 2nd word of rc as number
set rc to {Position, Lengthx, Substr(rc, 1 + |StrIndex|(rc, ":"), Lengthx)}
return rc
end |Match|
# Substitute into Txt for old by new with[out] GlobalChg
# Substituiert Pattern old durch new im String mit der Option with GlobalChg (alle)
# oder without GlobalChg (nur das erste)
# Beispiel: Substitute of stringdll for "tag" by "& nacht," into "Dienstag Mittwoch Donnerstag" with GlobalChg
# ergibt: "Dienstag nacht, Mittwoch Donnerstag nacht,"
on Substitute for old by new into Txt given GlobalChg:mode
set m to ""
set g to "0"
if mode then
set m to "g"
set g to "1"
end if
set awk to "<<++ awk -v G=" & g & " '{if(G || !n ) n=" & m & "sub(\"" & old & "\", \"" & new & "\");print $0 } '
" & Txt & "
++"
return do shell script awk
end Substitute
# Anzahl Vorkommen von pattern in Txt zählen
# Beispiel: PatternCount of stringdll for "tag" into " Dienstag Mittwoch Donnerstag " ergibt 2
# aber: PatternCount for "D.*tag" into " Dienstag Mittwoch Donnerstag " ergibt 1 !!
on PatternCount for pattern into Txt
if |CheckPattern|(pattern) then
return 0
end if
set awk to "<<++ awk '{ n+=gsub(\"" & pattern & "\", \" \") }
END { printf \"%d\", n } '
" & Txt & "
++"
set rc to do shell script awk
return rc as number
end PatternCount
# Der Handler sendet Tastenanschläge, die auch Umlaute enthalten können
# Zu beachten ist, dass beim Match als Pattern ein Punkt hinter der
# Umlautklasse angegeben werden muss, damit der Umlaut im 3rd item of match erscheint
# Die Länge des Matches ist dann auch 2, sie wird aber hier nicht benutzt
# Wenn zwei Umlaute hintereinander stehen, funktioniert's leider noch nicht
# Beispiel: KeyString("Käsebrötchen")
on KeyString(Txt)
set Delta to 135
set match to |Match| of me for "[äöüÄÖÜ]." into Txt
set pos to 1st item of match
if pos is 0 then
tell application "System Events" to keystroke Txt
else
set uml to 3rd item of match as string
if "ä" is uml then set Delta to 131
set uml to character id ((id of uml) - Delta)
tell application "System Events"
keystroke my Substr(Txt, 1, pos - 1)
keystroke "u" using option down
keystroke uml
set Txt to my Substr(Txt, pos + 1, count Txt)
my KeyString(Txt)
end tell
end if
end KeyString
# check embedded slash and newline
on |CheckPattern|(pattern)
if pattern contains "/" then
display dialog "pattern may not contain slash" buttons {"OK"} default button 1
return true
end if
if pattern contains "
" then
display dialog "pattern may not contain newline" buttons {"OK"} default button 1
return true
end if
return false
end |CheckPattern|
Vielleicht kann es jemand gebrauchen. |
|
Nach oben |
|
![](templates/subSilver/images/spacer.gif) |
Skeeve •---->
![•----> •---->](/phpBB2/images/ranks/ranki3.gif)
![](images/avatars/109842322644abb04db262b.gif)
Anmeldedatum: 20.04.2006 Beiträge: 1067
|
Verfasst am: 19.11.2010 - 22:29 Titel: |
|
|
Zitat: | awk: illegal primary in regular expression ++ at +
source line number 1
context is
/\+\+/ { >>> match($0,"\+\+") <<< |
Beim Aufruf von
Code: | return |StrIndex|("++test++", "\\+\\+")
|
Ja! Ich weiß warum, aber ich wollte Dir den ersten Bug schon mal zeigen (-;
_________________ "All problems are solved in slightly less than half an hour" (Chumbawamba, "Hey Hey We're The Junkies") |
|
Nach oben |
|
![](templates/subSilver/images/spacer.gif) |
woodpecker •--->
![•---> •--->](/phpBB2/images/ranks/ranki2.gif)
Anmeldedatum: 12.10.2010 Beiträge: 150 Wohnort: Roggentin/Rostock
|
Verfasst am: 19.11.2010 - 22:51 Titel: Ein UNIX-basiertes Substr |
|
|
Hallo nochmal,
der Substr-Handler im obigen Skript basiert rein auf AppleSkript. Die anderen sind zumeist UNIX-basiert. Deshalb gibt es u.U. ein Problem mit der Kompatibilität. Bei normalen Text-Strings fällt das nicht auf, wenn aber Sonderzeichen im Text sind, kann es sein, dass Substr nicht das liefert, was man erwartet.
Wenn z.B. ein
|Match| for "[[:print:]]{1,3}" into Txt
ein Ergebnis von {45,3,"Auf"} liefert, dann sollte ein
Substr(Txt,45,3) natürlich den String "Auf" zurückgeben.
Das war wie gesagt u.U. nicht der Fall.
Deshalb habe ich noch einen UNIX-basierten Substr-Handler geschrieben, der dieses Problem beseitigt.
on Substr(Txt, spos, len)
set Ntxt to do shell script "wc -c <<++
" & Txt & "
++"
set Ntxt to Ntxt as number
if spos is not greater than 0 or spos is greater than Ntxt then return ""
if len is not greater than 0 then set len to 1
set awk to "<<++ awk -v S=" & spos & " -v L=" & len & " ' { if( length >= S ) { rc=substr($0,S,L) ; nextfile} else S-=length+1}
END {print rc}'
" & Txt & "
++"
set rc to do shell script awk
return rc
end Substr
Viel Spass beim Ausprobieren.
Wenn man dieses Substr benutzt, ist allerdings auch noch eine kleine Änderung im Handler KeyString erforderlich, damit er funktioniert. Im tell-Block muss
Code: | set Txt to my Substr(Txt, pos + 2, count Txt) |
statt
Code: | set Txt to my Substr(Txt, pos + 1, count Txt) |
stehen.
Es war noch ein kleiner Fehler drin: Es muss heißen length >= S
Dieser Beitrag wurde zweimal editiert. Zuletzt : Montag, 22. November 2010 19:58:52 Uhr
Zuletzt bearbeitet von woodpecker am 22.11.2010 - 21:00, insgesamt 2-mal bearbeitet |
|
Nach oben |
|
![](templates/subSilver/images/spacer.gif) |
woodpecker •--->
![•---> •--->](/phpBB2/images/ranks/ranki2.gif)
Anmeldedatum: 12.10.2010 Beiträge: 150 Wohnort: Roggentin/Rostock
|
Verfasst am: 19.11.2010 - 23:24 Titel: Fehlermeldung awk |
|
|
Hallo Skeeve,
das ist kein Problem des Skripts. Im Terminal kommt der gleiche Fehler.
+ awk '{match($0,"\+\+");print RLENGTH}'
awk: illegal primary in regular expression ++ at +
source line number 1
context is
>>> {match($0,"\+\+") <<<
Ich denke das awk hat da ein Problem. Ich würde in dem Fall das Pattern anders formulieren, wenn möglich. Mit
|StrIndex|("++test++", "[[:punct:]]")
würde es z.B. funktionieren.
Gruß |
|
Nach oben |
|
![](templates/subSilver/images/spacer.gif) |
woodpecker •--->
![•---> •--->](/phpBB2/images/ranks/ranki2.gif)
Anmeldedatum: 12.10.2010 Beiträge: 150 Wohnort: Roggentin/Rostock
|
Verfasst am: 19.11.2010 - 23:34 Titel: |
|
|
Jetzt fällt mir gerade ein, wie es noch besser geht:
|StrIndex|("++test++", "[+]{2}")
Das funktioniert und liefert genau was Du willst. |
|
Nach oben |
|
![](templates/subSilver/images/spacer.gif) |
Skeeve •---->
![•----> •---->](/phpBB2/images/ranks/ranki3.gif)
![](images/avatars/109842322644abb04db262b.gif)
Anmeldedatum: 20.04.2006 Beiträge: 1067
|
Verfasst am: 19.11.2010 - 23:45 Titel: |
|
|
woodpecker hat Folgendes geschrieben: | Das funktioniert und liefert genau was Du willst. |
Und hier der nächste Bug:
Zitat: | sh: line 5: ++: command not found
sh: line 6: ++: command not found |
Code: | return |StrIndex|("++" & (ASCII character 10) & "test" & (ASCII character 10) & "++", "[+]{2}")
|
_________________ "All problems are solved in slightly less than half an hour" (Chumbawamba, "Hey Hey We're The Junkies") |
|
Nach oben |
|
![](templates/subSilver/images/spacer.gif) |
woodpecker •--->
![•---> •--->](/phpBB2/images/ranks/ranki2.gif)
Anmeldedatum: 12.10.2010 Beiträge: 150 Wohnort: Roggentin/Rostock
|
Verfasst am: 20.11.2010 - 00:14 Titel: |
|
|
Hallo Skeeve,
das würde ich jetzt auch nicht als Bug bezeichnen. Die Ursache liegt darin, dass ausgerechnet die Zeichen, die ich als EOF für das Here Document verwendet habe in Deinem Text als Zeile vorkommen. Das kann natürlich nicht funktionieren, da damit die Eingabe zu Ende ist und die SHELL wieder interpretiert. Wenn Du nicht ausschliessen kannst, dass im Text eine Zeile mit "++" vorkommt, kannst Du im Skript eine beliebige andere Zeichenfolge verwenden. Notfalls kann man die Zeichenfolge auch noch parametrierbar machen. Das wäre aber mit Kanonen auf Spatzen geschossen.
Versuchs mal mit
<<++..EndOfFile
Gruß woodpecker |
|
Nach oben |
|
![](templates/subSilver/images/spacer.gif) |
woodpecker •--->
![•---> •--->](/phpBB2/images/ranks/ranki2.gif)
Anmeldedatum: 12.10.2010 Beiträge: 150 Wohnort: Roggentin/Rostock
|
Verfasst am: 20.11.2010 - 00:40 Titel: Here Documents |
|
|
Eine bessere Variante wäre noch:
set EndOfFile to "EOF" & ((1000000 * (random number) as integer) as string)
do shell script "<<"& EndOfFile & " awk ...."
HereDocument
" & EndOfFile
Man könnte einen Handler schreiben:
on FileClose()
set EndOfFile to "EOF" & ((10000000 * (random number) as integer) as string)
return "++EOF" & EndOfFile
end FileClose
und ein SHELL-Aufruf mit HereDocument sieht dann z.B. so aus:
set EndOfFile to my FileClose()
set Ntxt to do shell script "wc -c <<" & EndOfFile & "
" & Txt & "
" & EndOfFile
Gruss woodpecker |
|
Nach oben |
|
![](templates/subSilver/images/spacer.gif) |
Skeeve •---->
![•----> •---->](/phpBB2/images/ranks/ranki3.gif)
![](images/avatars/109842322644abb04db262b.gif)
Anmeldedatum: 20.04.2006 Beiträge: 1067
|
Verfasst am: 20.11.2010 - 02:41 Titel: |
|
|
woodpecker hat Folgendes geschrieben: | Hallo Skeeve,
das würde ich jetzt auch nicht als Bug bezeichnen. |
Das kommt daher, daß Du Mathematiker und nicht Programmierer bist
Selbst mit 100000 Zufallszeichen kannst Du nicht 100% sicher sein.
Entweder Du nimmst ein Zeichen, bei dem Du ganz sicher bist, daß es in keinem Text vorkommt (ASCII Character 0) und wenn Du selbst das erlauben willst, nimmst Du einfach 2 beliebige Zeichen, testest, ob sie im Text vorkommen und hängst so lange Zufallszeichen an, bis die Zeichenfolge nicht mehr vorkommt.
Besser ist es aber, nicht mit "Here documents" zu arbeiten (ich dachte auch mal, die seien clever) sondern "quoted form of" zu nehmen.
Ich habe mal Dein stringdll in sowas umgewandelt. Da ich awk nicht beherrsche, habe ich perl gewhält und außerdem substr abgewandelt, weil mir die Einschränkungen nicht sinnvoll erschienen:
Code: |
|StrIndex|("a/s/dfg", "/s/")
-- 2
Substr("abcdefg", 2, 2)
-- "bc"
Substr("abcdefg", 2, -1)
-- "bcdef"
|Match| for " .*tag" into "Mittwoch Donnerstag"
-- {9, 11, " Donnerstag"}
Substitute for "tag" by "$& nacht," into "Dienstag Mittwoch Donnerstag" with GlobalChg without ignoreCase
-- "Dienstag nacht, Mittwoch Donnerstag nacht,"
Substitute for "/" by " slash " into "a/b/c/d" with GlobalChg without ignoreCase
-- "a slash b slash c slash d"
PatternCount for "tag" into " Dienstag Mittwoch Donnerstag "
-- 2
PatternCount for "D.*tag" into " Dienstag Mittwoch Donnerstag "
-- 1
on Substr(Txt, spos, len)
set perl to "perl -e " & quoted form of ("
print substr shift, (shift)-1, shift;
") & " " & quoted form of Txt & " " & quoted form of (spos as string) & " " & quoted form of (len as string)
set rc to do shell script perl
return rc
end Substr
on |StrIndex|(Txt, pattern)
return first item of (|Match| for pattern into Txt)
end |StrIndex|
on |Match| for pattern into Txt
set perl to "perl -e " & quoted form of ("
my $pattern= shift;
if (shift=~ /^(.*?)($pattern)/) {
printf q(%d %d:%s),1+length($1),length($2),$2;
}
else {
print q(0 0:);
}
") & " " & (quoted form of pattern) & " " & (quoted form of Txt)
set res to do shell script perl
set p to first word of res as number
set l to second word of res as number
set o to offset of ":" in res
set rc to {p, l, text (o + 1) thru -1 of res}
return rc
end |Match|
on Substitute for old by new into Txt given GlobalChg:mode, ignoreCase:icase
if mode then
set m to "g"
else
set m to ""
end if
if icase then
set m to m & "i"
end if
set perl to "perl -e " & quoted form of ("
my $pattern= shift;
my $replace= shift;
s#([/\\x27])#\\\\$1#g for ($pattern, $replace);
$_= shift;
eval qq's/$pattern/$replace/" & m & "';
print;
") & " " & (quoted form of old) & " " & (quoted form of new) & " " & (quoted form of Txt)
set res to do shell script perl
return do shell script perl
end Substitute
on PatternCount for pattern into Txt
set perl to "perl -e " & quoted form of ("
my $pattern= shift;
my @hits= (shift=~ /$pattern/g);
print scalar @hits;
") & " " & (quoted form of pattern) & " " & (quoted form of Txt)
return (do shell script perl) as number
end PatternCount
nd PatternCount
|
_________________ "All problems are solved in slightly less than half an hour" (Chumbawamba, "Hey Hey We're The Junkies") |
|
Nach oben |
|
![](templates/subSilver/images/spacer.gif) |
woodpecker •--->
![•---> •--->](/phpBB2/images/ranks/ranki2.gif)
Anmeldedatum: 12.10.2010 Beiträge: 150 Wohnort: Roggentin/Rostock
|
Verfasst am: 20.11.2010 - 11:50 Titel: |
|
|
Zitat: | Selbst mit 100000 Zufallszeichen kannst Du nicht 100% sicher sein.
|
Will ich auch nicht. Mir reicht eine Sicherheit, die für die praktische Anwendung völlig ausreichend ist. Wenn man 100% sicher sein will, darf man nicht leben.
Zitat: | Besser ist es aber, nicht mit "Here documents" zu arbeiten (ich dachte auch mal, die seien clever) sondern "quoted form of" zu nehmen.
|
Bei awk kann man die Daten nicht als Kommandoargument übergeben, sondern sie werden immer irgendwie eingelesen. Das heißt, ich müsste jedes Mal eine Pipe mit
Code: |
"echo " & quoted form of Txt & " | awk ..."
|
davor schalten. Das wollte ich vermeiden.
Leider beherrsche ich nun wieder kein perl, so dass ich lieber bei meiner awk-Version bleibe. Die Idee, das |StrIndex| wieder auf das |Match| zurückzuführen ist aber auf jeden Fall gut. Das werde ich in meiner Version aufgreifen.
Gruß woodpecker |
|
Nach oben |
|
![](templates/subSilver/images/spacer.gif) |
Skeeve •---->
![•----> •---->](/phpBB2/images/ranks/ranki3.gif)
![](images/avatars/109842322644abb04db262b.gif)
Anmeldedatum: 20.04.2006 Beiträge: 1067
|
Verfasst am: 20.11.2010 - 13:20 Titel: |
|
|
woodpecker hat Folgendes geschrieben: | Zitat: | Selbst mit 100000 Zufallszeichen kannst Du nicht 100% sicher sein.
|
Will ich auch nicht. Mir reicht eine Sicherheit, die für die praktische Anwendung völlig ausreichend ist. Wenn man 100% sicher sein will, darf man nicht leben.
|
Programme sind nicht das Leben und solche unterlassenen Kleinigkeiten sorgen dafür, daß Du später Stunde um Stunde mit dem Debugging zubringen darfst.
woodpecker hat Folgendes geschrieben: |
Zitat: | Besser ist es aber, nicht mit "Here documents" zu arbeiten (ich dachte auch mal, die seien clever) sondern "quoted form of" zu nehmen.
|
Bei awk kann man die Daten nicht als Kommandoargument übergeben, sondern sie werden immer irgendwie eingelesen. Das heißt, ich müsste jedes Mal eine Pipe mit
|
Das stimmt nicht! man awk sagt:
Zitat: |
ARGC argument count, assignable
ARGV argument array, assignable; non-null members are taken as file-
names
|
Code: |
awk '
BEGIN {
for (i = 1; i < ARGC; i++)
printf "%s ", ARGV[i]
printf "\n"
}' adsad da ads
adsad da ads
|
Und sich nicht mit perl auszukennen ist nicht sträflich. Aber die Energie, die Du ins awk Lernen gesteckt hast, wäre besser ins perl lernen gesteckt worden. Perl ist deutlich mächtiger und wesentlich weniger kryptisch (wenn man es nicht gerade auf Kryptik anlegt ) _________________ "All problems are solved in slightly less than half an hour" (Chumbawamba, "Hey Hey We're The Junkies") |
|
Nach oben |
|
![](templates/subSilver/images/spacer.gif) |
woodpecker •--->
![•---> •--->](/phpBB2/images/ranks/ranki2.gif)
Anmeldedatum: 12.10.2010 Beiträge: 150 Wohnort: Roggentin/Rostock
|
Verfasst am: 20.11.2010 - 14:11 Titel: |
|
|
Zitat: | ... und solche unterlassenen Kleinigkeiten sorgen dafür, daß Du später Stunde um Stunde mit dem Debugging zubringen darfst. |
Aber nicht bei einer Wahrscheinlichkeit von 10^(-22). Wir wollen doch mal auf dem Teppich bleiben.
Dieser Handler zur Erzeugung eines EOF-Strings gefällt mir jetzt ganz gut. Den benutze ich:
Code: | on EOFHereDoc()
set StrEOF to "Das+ist+ein+Text+der+den+EOF+String+fuer+HereDocuments+liefert.Er+kann+beliebig+verlaengert+werden.Aber+Vorsicht+mit+Sonderzeichen"
set EndOfFile to {}
repeat with k from 1 to ((random number from 15 to 20) as integer)
copy some character of StrEOF to end of EndOfFile
end repeat
return EndOfFile as string
end EOFHereDoc
|
Zu dem Problem der awk-Argumente:
Was Du da gemacht hast, ist ein awk-Programm, das seine Argumente ausgibt. Das ist ja im Prinzip nichts anderes als eine echo-Implementierung in awk. Das funktioniert zwar so, aber das ist ja nicht das was man haben will. Ich will ja eine Datei einlesen und ihren Inhalt mit einem awk-Programm bearbeiten. Das müsste ja jetzt noch folgen.
Zitat: | Aber die Energie, die Du ins awk Lernen gesteckt hast, wäre besser ins perl lernen gesteckt worden.Perl ist deutlich mächtiger und wesentlich weniger kryptisch |
Geschmacksache. Ich finde awk ist fast schon wie C und wenn man das beherrscht, ist es zu awk nur ein kleiner Schritt. Für mich ist Dein perl-Programm etwas kryptisch. Aber da kann man schlecht drüber streiten...
Gruß woodpecker |
|
Nach oben |
|
![](templates/subSilver/images/spacer.gif) |
Skeeve •---->
![•----> •---->](/phpBB2/images/ranks/ranki3.gif)
![](images/avatars/109842322644abb04db262b.gif)
Anmeldedatum: 20.04.2006 Beiträge: 1067
|
Verfasst am: 21.11.2010 - 19:16 Titel: |
|
|
woodpecker hat Folgendes geschrieben: | Was Du da gemacht hast, ist ein awk-Programm, das seine Argumente ausgibt. |
Eben! Und wenn es die ausgeben kann, wir es die wohl auch verarbeiten können. Du übergibst den Text einfach als Parameter. _________________ "All problems are solved in slightly less than half an hour" (Chumbawamba, "Hey Hey We're The Junkies") |
|
Nach oben |
|
![](templates/subSilver/images/spacer.gif) |
Skeeve •---->
![•----> •---->](/phpBB2/images/ranks/ranki3.gif)
![](images/avatars/109842322644abb04db262b.gif)
Anmeldedatum: 20.04.2006 Beiträge: 1067
|
Verfasst am: 21.11.2010 - 23:08 Titel: |
|
|
Probier mal folgendes, woody:
Code: |
awk -v pattern=a -v txt="fehlschlag" 'BEGIN { print match(txt, pattern) }'
|
Gut, gell?
Wenn ich nicht irre mußt Du hier nichtmal darauf achten, daß im Pattern kein "/" vorkommt. Außerdem brauchste kein here-document, da "quoted form of" für pattern und text reichen.
Versuch's halt mal. _________________ "All problems are solved in slightly less than half an hour" (Chumbawamba, "Hey Hey We're The Junkies") |
|
Nach oben |
|
![](templates/subSilver/images/spacer.gif) |
woodpecker •--->
![•---> •--->](/phpBB2/images/ranks/ranki2.gif)
Anmeldedatum: 12.10.2010 Beiträge: 150 Wohnort: Roggentin/Rostock
|
Verfasst am: 22.11.2010 - 13:51 Titel: |
|
|
Zitat: | Eben! Und wenn es die ausgeben kann, wir es die wohl auch verarbeiten können. Du übergibst den Text einfach als Parameter. |
Gut gebrüllt, Löwe! Du hast ja natürlich recht. Allerdings ist die Sache ja noch viel einfacher, da man immer nur genau ein Argument hat (wegen quoted form of ...). Ohne "quoted form of" geht's natürlich überhaupt nicht, da dann eingebettete Leerzeichen von der SHELL zu einem einzigen zusammengedampft werden. Jetzt bleibt allerdings noch die Frage: Was macht quoted form of mit eingebetteten Single Quotes? Werden die SHELL-gerecht behandelt?
Was allerdings auch noch offen ist: Wenn die Daten nicht aus einer Datei kommen, wird natürlich auch nicht $0 gesetzt (Eingabezeile). Dann muss ich die Zeilen selbst verwalten. Ob das einfacher ist, weiß ich noch nicht. Das muss man sich im einzelnen ansehen.
Einen Versuch ist es auf jeden Fall wert. Ich probier's mal.
Ähm, sagtest Du, dass Du kein awk beherrscht? |
|
Nach oben |
|
![](templates/subSilver/images/spacer.gif) |
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
Powered by phpBB © 2001, 2002 phpBB Group Deutsche Übersetzung von phpBB.de
|
|
|