Re: Nochmals Skript-Frage - grep zwischen 2 "Markern"
Joachim Kieferle <joakie@architektur.fh-wiesbaden.de> schrieb am 16.03.05 12:38:38:
habe doch nochmal eine Skriptfrage. Und zwar: wie kann ich Text zwischen 2 Markern greppen (also grep -o) und zwar bräuchte ich von der Zeile
{<</PageSize [2494.488037 3685.039063] /Policies <</PageSize 1>> >> setpagedevice }stopped pop
alles zwischen dem "[" und "]".
Falls dies und Dein erstes Problem zusammenhaengen, kannst Du es evtl. wie folgt in einem Aufwasch loesen: sed -n '/\%\%BeginFeature: \*CustomPageSize True/,+1 s/.*PageSize \[\([0-9. ]*\)\] \/Policies.*/\1/ p' datei Falls es sich um getrennte Probleme handelt, dann verwende nur den zweiten Teil des sed-Kommandos. Wie immer: ohne Gewaehr, ich bin auch kein Spezialist in diesen Dingen, aber David wird mich dann schon korrigieren... Cheers, Th.
Thomas Hertweck wrote:
Joachim Kieferle <joakie@architektur.fh-wiesbaden.de> schrieb am 16.03.05 12:38:38:
habe doch nochmal eine Skriptfrage. Und zwar: wie kann ich Text zwischen 2 Markern greppen (also grep -o) und zwar bräuchte ich von der Zeile
{<</PageSize [2494.488037 3685.039063] /Policies <</PageSize 1>> >> setpagedevice }stopped pop
alles zwischen dem "[" und "]".
Falls dies und Dein erstes Problem zusammenhaengen, kannst Du es evtl. wie folgt in einem Aufwasch loesen:
sed -n '/\%\%BeginFeature: \*CustomPageSize True/,+1 s/.*PageSize \[\([0-9. ]*\)\] \/Policies.*/\1/ p' datei
Falls es sich um getrennte Probleme handelt, dann verwende nur den zweiten Teil des sed-Kommandos.
[ ... ] Hallo Thomas, hallo Arnold, vielen Dank für Eure Hilfe. Jetzt durchsuche ich die Postscriptdateien (um die Papiergrösse auszuwerten) für einen DesignJet 800 PS mit nachfolgendem Skriptausschnitt. Ist wahrscheinlich nicht prima programmiert aber es funktioniert ;-)). Bin gespannt, was David dazu sagen wird. Auf jeden Fall hat Dein Tipp, Thomas, mir weitergeholfen, auch wenn ich das "\1" gegen Ende der sed-Zeile noch nicht verstehe. Vielleicht kannst Du das noch bei Gelegenheit erläutern. Viele Grüsse Joachim ++++++ und hier der Skript-Ausschnitt ++++++ custompagesize=`grep -a -c CustomPageSize $spoolDir/$inputFile` if test $custompagesize -eq 0; then papierroh=`grep "<<\/PageSize" $spoolDir/$inputFile \ | sed 's/.*\[\([0-9. ]*\)\].*/\1/g' \ | sed 's/ /;/g' ` else papierroh=`grep -A2 CustomPageSize $spoolDir/$inputFile \ |sed 's/\r//g' \ | sed 's/^\([0-9. ]*\).*/\1/g' \ | sed 's/^ $//g' \ | grep . \ | head -1 \ | sed 's/ /;/g' ` fi
Joachim Kieferle wrote:
[...] Auf jeden Fall hat Dein Tipp, Thomas, mir weitergeholfen, auch wenn ich das "\1" gegen Ende der sed-Zeile noch nicht verstehe. Vielleicht kannst Du das noch bei Gelegenheit erläutern.
$> man 7 regex [...] Finally, there is one new type of atom, a back reference: ‘\' followed by a non-zero decimal digit d matches the same sequence of characters matched by the dth parenthesized subexpression (numbering subexpressions by the positions of their opening parentheses, left to right) [...] In der sed-Zeile kam ein Ausdruck \( \) vor. Alles zwischen diesen Klammern kann spaeter durch ein \1 referenziert werden. Kommen mehrere dieser Klammern-Paare vor, so gibt es auch ein \2 usw. In obigem Auszug aus der man-page steht, wie geschachtelte Paare ausgewertet werden. Allerdings ist "man 7 regex" nicht einfach zu lesen, und noch weniger einfach zu verstehen. Ich hatte vor einiger Zeit mal eine Einfuehrung zu dem Thema aufgesetzt, http://www.thomashertweck.de/sedawk.html. David hat dazu angemerkt, dass hier "alte" und "neue" (erweitere) regulaere Ausdruecke gemischt werden, und er hat natuerlich recht. Ich bin bisher leider nicht dazu gekommen, das auseinander zu pfrimeln und den Text besser zu gestalten. Vielleicht hilft er Dir dennoch weiter... Cheers, Th.
Hallo, Am Wed, 16 Mar 2005, Joachim Kieferle schrieb:
Thomas Hertweck wrote:
Joachim Kieferle <joakie@architektur.fh-wiesbaden.de> schrieb am 16.03.05 12:38:38:
habe doch nochmal eine Skriptfrage. Und zwar: wie kann ich Text zwischen 2 Markern greppen (also grep -o) und zwar bräuchte ich von der Zeile
Erst ein _aktuelles_ GNU grep kennt die Option '-o'! Sed ist geeigneter und portabel.
{<</PageSize [2494.488037 3685.039063] /Policies <</PageSize 1>> >> setpagedevice }stopped pop
alles zwischen dem "[" und "]".
Falls dies und Dein erstes Problem zusammenhaengen, kannst Du es evtl. wie folgt in einem Aufwasch loesen:
sed -n '/\%\%BeginFeature: \*CustomPageSize True/,+1 s/.*PageSize \[\([0-9. ]*\)\] \/Policies.*/\1/ p' datei
sed -n '/%%BeginFeature: \*CustomPageSize True/{ n; s@.*PageSize \[\([0-9. ]*\)\] /Policies.*@\1@p; }' datei [..]
vielen Dank für Eure Hilfe. Jetzt durchsuche ich die Postscriptdateien (um die Papiergrösse auszuwerten) für einen DesignJet 800 PS mit nachfolgendem Skriptausschnitt. Ist wahrscheinlich nicht prima programmiert aber es funktioniert ;-)). Bin gespannt, was David dazu sagen wird.
*g*
Auf jeden Fall hat Dein Tipp, Thomas, mir weitergeholfen, auch wenn ich das "\1" gegen Ende der sed-Zeile noch nicht verstehe. Vielleicht kannst Du das noch bei Gelegenheit erläutern.
=> man sed s/regexp/replacement/ Attempt to match regexp against the pattern space. If successful, replace that portion matched with replacement. The replacement may contain the spe cial character & to refer to that portion of the pattern space which matched, and the special escapes \1 through \9 to refer to the corresponding matching sub-expressions in the regexp. => man 7 regex (=> sed verwendet "Basic Regular Expressions" (BREs)) [..] The parentheses for nested subexpressions are `\(' and `\)', with `(' and `)' by themselves ordinary characters. [..] Finally, there is one new type of atom, a back reference: `\' followed by a non-zero decimal digit d matches the same sequence of characters matched by the dth parenthesized subexpression (numbering subexpressions by the positions of their opening parentheses, left to right), Auf deutsch: Mit \(\) kann man einen Ausdruck "speichern" und mit \N auf den Nten geklammerten Ausdruck zugreifen. Beispiel: echo 'abcdefgh' | sed 's/^\(.\)\(.\)\(.\)\(.\)\(.\)\(.\)\(.\)\(.\)/\2\1\3\8/' oder echo 'abcdefgh' | sed 's/^\(.\)\(.\)\(.\)\(.\)\(.\)\(.\)\(.\)\(.\)/\1\2\2\1/'
++++++ und hier der Skript-Ausschnitt ++++++
custompagesize=`grep -a -c CustomPageSize $spoolDir/$inputFile`
Mein GNU grep kennt keine Option '-a'.
if test $custompagesize -eq 0; then papierroh=`grep "<<\/PageSize" $spoolDir/$inputFile \ | sed 's/.*\[\([0-9. ]*\)\].*/\1/g' \ | sed 's/ /;/g' `
*ARGH*
else papierroh=`grep -A2 CustomPageSize $spoolDir/$inputFile \ |sed 's/\r//g' \ | sed 's/^\([0-9. ]*\).*/\1/g' \ | sed 's/^ $//g' \ | grep . \
Du willst hiermit leere Zeilen loeschen?
| head -1 \ | sed 's/ /;/g' ` fi
*ARGH* Good sigmonster! Joachim: Merk dir eins: Wenn du sed verwendest brauchst du kein grep mehr! Und mehrere seds kannst du durch eines mit mehreren Befehlen oder Ausdruecken ersetzen. Also statt "sed 'A1' | sed 'A2'" geht "sed -e 'A1;A2;'" oder ggfs. "sed -e 'A1' -e 'A2'". Jedenfalls: deinen 'else'-Zweig kann ich nicht wirklich nachvollziehen. Wie sehen diese 3 Zeilen denn aus? Und gibt es beim 'if'-Zweig evtl. mehrere Zeilen? Beachte, dass ich die if-Bedingung umkehre. ==== UNGETESTET da Vorgaben nur teils nachvollziehbar ==== ifile="${spoolDir}/${inputFile}" if grep -q 'CustomPageSize' "$ifile"; then papierroh="`sed -n '/CustomPageSize/{ n; N; s@.*/PageSize \[\([0-9. ]\+\)\].*@\1@; /^[[:space:]]*$/d; s/ /;/g; p; }' \"$ifile\"`" else papierroh="`sed -n '/<<\/PageSize/{ s@.*<</PageSize \[\([0-9. ]\+\)\].*@\1@; s/ /;/g; p; }' \"$ifile\"`" fi ==== Haette ich Beispieldaten koennte wohl auch noch das if und grep wegfallen. Also, Joachim, mail mir PM mal Beispieldatein oder schreib hier die relevanten Zeilen und schreibe dann auch, was du genau haben willst ;) -dnh -- Brain fried -- Core dumped
participants (3)
-
David Haller
-
Joachim Kieferle
-
Thomas Hertweck