[unix-ws] piping mit sed

Jan Eden lists at jan-eden.de
Die Nov 18 12:54:51 CET 2003


Hallo,

Martin Schulte wrote:

>Hallo!
>
>> ich habe ein Problem mit folgender Aufgabe: Ich rufe ein Skript mit zwei
>> Argumenten von der Kommandozeile auf, die Argumente (Dateinamen) werden
>> verwendet.
>>
>> Am Schluss soll eine modifizierte Version des zweiten Arguments (z.B.
>> scheine2.tex") an die Shell gegeben werden. Mein Versuch:
>>
>> echo "$2" | sed "s/\(.+\)\.tex/open '\1\.pdf'/" | sh -v
>
>Warum es mit sed nicht funktioniert, weiß ich nicht, aber mit kleiner 
>Änderung schluckt perl diesen regulären Ausdruck:
>  echo "$2" | perl -p -e "s/(.+)\.tex/open '\1\.pdf'/"
>
Vielen Dank für den Hinweis, ich habe mit den perl-Optionen p und e schon experimentiert (s. meine Antwort an Sebastian Hagedorn). Allerdings hatte ich da vergessen, die Backslashes vor den Klammern \(\) des subpattern zu entfernen.

Bei der backreference mit  "\1" bekomme ich im -w Modus allerdings eine Warnung. Ich habe es deshalb mit dem normalen "$1" probiert - was wunderbar funktioniert:

echo "$ausdatei" | perl -p -e 's/(.+)\.tex/open $1\.pdf/' | sh

>Etwas glücklicher scheint mir jedoch ohnehin
>  open `basename $2 .tex`.pdf
>zu sein.

In der Tat. Ich hatte angenommen, basename gäbe immer den gesamten Dateinamen (ohne Pfad) zurück, die Kürzungsfunktion kannte ich nicht. Danke!

>(Wenn ich das richtig verstanden habe, ist open ein selbstgemachtes 
>Kommando).

open ist ein Befehl, der unter Mac OS X eine Datei im voreingestellten Programm öffnet.

Jetzt kann ich mich wieder ganz auf Perl verlassen. Der Wechsel zwischen sed und Perl ist bei den kleinen Unterschieden doch ziemlich verwirrend. Danke!

Freundliche Grüße

Jan Bruners
-- 
These are my principles and if you don't like them... well, I have others. - Groucho Marx