Hallo, ich habe folgendes Problem: irgendein-config-file: # section begin bla bla # section end Ich will nun '^# section begin$.*^#section end$' durch was anderes ersetzen. Kann man z.B. sed beibringen, dass es ueber mehrere Zeilen ersetzt? Man koennte so was auch mit einem sh-Skript erledigen, allerdings sind dann umstaendliche Sicherheitsabfragen notwendig. Es wuerde auch schon reichen, wenn grep oder so was aehnliches Multilineregex verstehen wuerde. Darueber habe ich aber leider nix in der Doku gefunden. SuSE muss diese Problem ja schon geloest haben, weiss vielleicht jemand ein Beispielskript? Ciao
Hallo, On Thu, 19 Sep 2002, Sebastian Huber wrote:
Hallo, ich habe folgendes Problem: irgendein-config-file: # section begin bla bla # section end
Ich will nun '^# section begin$.*^#section end$' durch was anderes ersetzen. Kann man z.B. sed beibringen, dass es ueber mehrere Zeilen ersetzt?
Ja natuerlich, dazu dienen die Adressoperatoren von sed: sed '/^# section begin/,/^# section end/c\ fo bla' < alt > neu (zwei(!) Zeilen, mit durch '\' maskierten Zeilenumbruch) Zu 'c' siehe man sed, das steht fuer 'change', der gesamte Adressbereich wird geaendert. Die Adressoperatoren kann man auch fuer fast alle anderen sed-Befehle verwenden, bei manchen Kombinationen macht das allerdings wenig Sinn, z.B: sed -n '1,$p' < datei Man kann auf Adressbereichen durch Blockbildung auch mehrere Befehle ausfuehren, z.B: sed '/^# section begin/,/^# section end/{s/bla/fasel/g;s/blubb/laber/;} -dnh -- Make sure that they know you know that they know you know. -- Mike Andrews on getting license keys by mail (from a certain Corp.)
On Thu, 2002-09-19 at 23:48, Sebastian Huber wrote:
Hallo, ich habe folgendes Problem: irgendein-config-file: # section begin bla bla # section end
Da hast Du ja Glück, daß ich gerade dafür gestern einen Einzeiler gemacht habe: perl -e 'undef $/; foreach (@ARGV) { $file = $_; open FILE, $_ ; while (<FILE>) {print "\t\"", $file, "\" => \"" , $1, "\", \n" if /<title>\s*([.,a-zA-Z0-9 -]*)\s*<\/title>/s;}}' FILENAME In Klammern steht das, was Du einfangen willst. <title> war bei mir der Beginn </title> das Ende Das Geheimnis bei der Regex ist der Schalter /s der . auch \n matchen läßt. Mit undef $/ wird verhindert, daß die whileschleife Zeilenweise vorgeht. HTH V. -- Volker Kroll 4mino AG Chief System Developer Chausseestr. 52 b volker.kroll@4mino.de D-10115 Berlin Tel.: +49-30-2888490-0 Fax.: +49-30-2888490-99
perl ist i.A. der bessere Ansatz, aber es geht auch so: awk '/^# section begin/{x++;next}/^# section end/{x--;print "was anders";next}(x>=1){next}{print}' file Achim
participants (4)
-
Achim Hoffmann
-
David Haller
-
Sebastian Huber
-
Volker Kroll