Henrik Schneider wrote:

> Gibt es eine Möglichkeit allen Benutzern eines PC die Startup Webseite
> festzulegen? Im moment schaut es bei uns so aus, das sich alle Benutzer
> ihre Startseite ändern, und somit keinen Blick mehr ins Intranet werfen.
> Ich dachte mir, ich suche nach einem shell-script das nach
> "browser.startup.homepage" in der prefs.js sucht und die ganze Zeile
> dann durch meine Vorgabe ersetzt. Nach ein wenig google habe ich aber
> nichts gefunden das genau dies tut. Alle Scripte suchen nur einen
> definierten Ausdruck und ersetzen dann genau diesen. Da die gesuchte
> zeile aber wie folgt aussieht:
>
> user_pref("browser.startup.homepage", "http://www.google.de";);
>
> steh ich ein bischen im Wald, denn die Syntax von sed bleibt mir auch
> nach mehreren Versuchen ein Mysterium.
> Hat jemand von euch was in petto, das mir da helfen könnte?

So schwer ist das gar nicht mit dem sed. Das Ersetzen funktioniert damit so:
sed s/<zu suchender Ausdruck>/<Ersetzung>/<Flags>
Das "s" sagt sed, daß etwas ersetzt werden soll und die "/" dienen als 
Begrenzer zwischen dem zu suchenden Ausdruck, der Ersetzung und den Flags.
Bei dem, was Du vor hast, würde das also bspw. so aussehen:

sed 's/user_pref("browser.startup.homepage", 
"[^"]*");/user_pref("browser.startup.homepage", "http:
\/\/www.pug.org");/' <Eingabedatei>

Zu den Besonderheiten:
- Der zu suchende Ausdruck wird als regulärer Ausdruck interpretiert. Das
"[^"]*"
im zu suchenden Ausdruck paßt daher auf ein Anführungszeichen gefolgt von 
einem beliebigen Zeichen, das kein Anführungszeichen ist, wobei der * sagt, 
daß es beliebig viele dieser Zeichen sein dürfen, gefolgt von einem 
Anführungszeichen. MaW: "[^"]*" paßt auf eine beliebige in Anführungszeichen 
eingeschlossene Zeichenkette, die selbst kein Anführungszeichen enthält, und 
paßt damit natürlich insbesondere auf einen beliebigen in Anführungszeichen 
eingeschlossenen URL.
- Da die / als Begrenzer zwischen den einzelnen Teilen der Ersetzungsregel 
dienen, muß man für /, die bspw. im zu ersetzenden Text als Zeichen vorkommen 
sollen, deutlich machen, daß sie in diesem Fall eben nicht als Begrenzer 
fungieren. Das tut man durch Voranstellen von (Escapen mit) \. 
Deswegen "http:\/\/...".
Das ist natürlich nicht schön und man hat schnell mal einen \ vergessen. Da 
hilft es dann, daß es nicht unbedingt der / sein muß, der als 
Begrenzungszeichen verwendet wird. Man kann sich auch ein anderes Zeichen 
aussuchen, z. B. @. Das würde dann so aussehen:

sed '[EMAIL PROTECTED]("browser.startup.homepage", 
"[^"]*");@user_pref("browser.startup.homepage", "http://www.pug.org";);@'

- Der gesamte Ausdruck ist deswegen in ' eingeschlossen, damit die Shell 
bestimmte Zeichen wie die " nicht weginterpretiert.

Noch etwas:
- Hinreichend neue Versionen von GNU sed erlauben per -i, daß sed die 
Eingabedatei direkt verändert anstatt das Ergebnis nach stdout zu schreiben.
- Der Punkt steht in regulären Ausdrücken für ein beliebiges Zeichen. Im 
Prinzip müßte der oben auch escaped werden, um klar zu machen, daß es in 
diesem Falle nicht um ein beliebiges Zeichen sondern um das Zeichen Punkt 
geht:
browser\.startup\.homepage
- Flags brauchen wir in diesem Beispiel nicht, deswegen sind auch keine 
angegeben.

Gruß
  mks
-- 
----------------------------------------------------------------------------
PUG - Penguin User Group Wiesbaden - http://www.pug.org

Antwort per Email an