Re: Suchen und Ersetzen mit einem Bash.-Script
Am Fri, 31 Oct 2014 15:25:13 +0100 schrieb "Dr. Juergen Vollmer" <juergen.vollmer@informatik-vollmer.de>:
Am Freitag 31 Oktober 2014, 13:04:04 schrieben Sie:
Am Fri, 31 Oct 2014 12:29:48 +0100 schrieb Dr. Jürgen Vollmer <juergen.vollmer@informatik-vollmer.de>:
Hallo Al
Am Donnerstag, 30. Oktober 2014, 22:57:52 schrieb Аl Воgnеr:
Gegeben ist beispielhaft
Textdatei="irgendwas.txt"
Darin befindet sich zB ------------------------ bla blub worte keyword1 bla suchkriterium 'wort1:wort2:wort3:etc' xx blu blo worte keyword1 bla suchkriterium 'wort1:wort2:wort3:etc' yy worte keyword1 bla suchkriterium 'wort1:wort2:wort3:etc' zz was anderes etc ------------------------
Nun geht es darum in einem Bash-Script den Teil zwischen '' zu ersetzen, wenn in der Zeile das Suchkriterium gefunden wird, wobei das zu Ersetzende in einer Variable gespeichert ist. Der Aufruf des Textes erfolgt über die Variable Textdatei.
In diesem Fall würde also in folgenden Zeilen das zu ersetzen sein, das sich zwischen den '' befindet, also 'wort1:wort2:wort3:etc'
worte keyword1 bla suchkriterium 'wort1:wort2:wort3:etc' xx worte keyword1 bla suchkriterium 'wort1:wort2:wort3:etc' yy worte keyword1 bla suchkriterium 'wort1:wort2:wort3:etc' zz
und zwar durch
neu="wort4:wort5:etc"
Gegeben ist, dass nach "suchkriterium" immer ein Text folgt, der zwischen '' steht und der zu ersetzen ist. Die Länge des Textes zwischen den '' ist meistens konstant, aber ich denke das ist nicht so wichtig.
Wie macht man das am besten? Mit sed, awk oder?
Αl
sed -e "/suchkriterium/ s/'wort1:wort2:wort3:etc'/'wort4:wort5:etc'/" $Textdatei
Siehe auch http://de.wikipedia.org/wiki/Sed_%28Unix%29
Danke, aber zum einen bitte als Variable (und da habe ich bei sed immer Probleme) und zum anderen bin ich mir nicht sicher, ob es das tut, das ich möchte. Ich weiß ja nicht, was der zu suchende Teil ist, sondern weiß nur, dass es der Teil nach dem Suchkriterium ist auf das ' folgt und mit ' endet.
Αl
---- #!/bin/sh datei=was-auch-immer.txt suche=suchkriterium neu=wort4:wort5:etc sed -e "/$suche/ s/'.*'/'$neu'/" $datei ----
ok, es mag Probleme geben, wenn suchkriterium selbst ein ' oder andere "kritische" Zeichen wie $ oder " enthält. Dann muss man das ganze aber eben noch escapen. Gleiches für Ersetztext "$neu"
Hallo Jürgen, das Suchkriterium sollte normalerweise kein ' oder $ enthalten und fängt meistens mit einem @ an. Leider macht das Script noch nicht das, was ich mir vorstelle. Es ersetzt den Teil zwischen den '', der das _1._ Mal vorkommt und nicht _nach_ dem Suchkriterium. Tatsächlich ist es in der Zeile meistens die 3. Zeichenkette mit ''. Außerdem wird nur in der 1. Zeile ersetzt, wo das Suchkriterium gefunden wird und nicht in allen Zeilen, wo das Suchkriterium vorkommt. @David, der awk-Befehl ist wirklich gruselig und ich verstehe ihn noch nicht. Aber ich probiere damit rum. Ich gebe "suchkriterium" als Text ein, aber wenn es geht sollte alles in Variablen gepackt werden, das möglich ist, also so wie es Jürgen gemacht hat. datei=was-auch-immer.txt suche=suchkriterium neu=wort4:wort5:etc Αl -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um den Listen Administrator zu erreichen, schicken Sie eine Mail an: opensuse-de+owner@opensuse.org
Hallo Al, Am Freitag 31 Oktober 2014, 22:44:08 schrieb Аl Воgnеr:
---- #!/bin/sh datei=was-auch-immer.txt suche=suchkriterium neu=wort4:wort5:etc sed -e "/$suche/ s/'.*'/'$neu'/" $datei ----
ok, es mag Probleme geben, wenn suchkriterium selbst ein ' oder andere "kritische" Zeichen wie $ oder " enthält. Dann muss man das ganze aber eben noch escapen. Gleiches für Ersetztext "$neu"
Hallo Jürgen,
das Suchkriterium sollte normalerweise kein ' oder $ enthalten und fängt meistens mit einem @ an.
Leider macht das Script noch nicht das, was ich mir vorstelle.
Es ersetzt den Teil zwischen den '', der das _1._ Mal vorkommt und nicht _nach_ dem Suchkriterium. Tatsächlich ist es in der Zeile meistens die 3. Zeichenkette mit ''. Außerdem wird nur in der 1. Zeile ersetzt, wo das Suchkriterium gefunden wird und nicht in allen Zeilen, wo das Suchkriterium vorkommt.
das verstehe ich nicht: bei mir kommt folgendes 'raus: bei der Eingabe (in einer Datei) ------ bla blub worte keyword1 bla suchkriterium 'wort1:wort2:wort3:etc' xx blu blo worte keyword1 bla suchkriterium 'wort1:wort2:wort3:etc' yy worte keyword1 bla suchkriterium 'wort1:wort2:wort3:etc' zz was anderes etc ----------- liefert mein Script ----------- bla blub worte keyword1 bla suchkriterium 'wort4:wort5:etc' xx blu blo worte keyword1 bla suchkriterium 'wort4:wort5:etc' yy worte keyword1 bla suchkriterium 'wort4:wort5:etc' zz was anderes etc ---- es wird also in allen Zeilen ersetzt. Dies entspricht Deiner Spezifikation. Aber vielleicht wäre es besser, eine konkrete Eingabedatei zu sehen, und das konkrete gewünschte Ergebnis. Bye Jürgen -- Dr.rer.nat. Jürgen Vollmer, Am Rennbuckel 21, D-76185 Karlsruhe Tel: +49(721) 92 04 87 1 Fax: +49(721) 92 04 87 2 Juergen.Vollmer@informatik-vollmer.de www.informatik-vollmer.de ------------------------------------------------------------------------------- Diese EMail ist elektronisch mittels GPG / PGP signiert. Diese elektronische Unterschrift ist in einem EMail-Anhang enthalten. Leider kann die Signatur ohne die Installation entsprechender Programme weder geprüft noch angezeigt werden. Mehr dazu unter: http://www.gnupg.org oder auch http://www.pgpi.org -------------------------------------------------------------------------------
Am Fri, 31 Oct 2014 23:12:56 +0100 schrieb "Dr. Juergen Vollmer" <juergen.vollmer@informatik-vollmer.de>: Hallo Jürgen,
Am Freitag 31 Oktober 2014, 22:44:08 schrieb Аl Воgnеr:
---- #!/bin/sh datei=was-auch-immer.txt suche=suchkriterium neu=wort4:wort5:etc sed -e "/$suche/ s/'.*'/'$neu'/" $datei ----
ok, es mag Probleme geben, wenn suchkriterium selbst ein ' oder andere "kritische" Zeichen wie $ oder " enthält. Dann muss man das ganze aber eben noch escapen. Gleiches für Ersetztext "$neu"
Hallo Jürgen,
das Suchkriterium sollte normalerweise kein ' oder $ enthalten und fängt meistens mit einem @ an.
Leider macht das Script noch nicht das, was ich mir vorstelle.
Es ersetzt den Teil zwischen den '', der das _1._ Mal vorkommt und nicht _nach_ dem Suchkriterium. Tatsächlich ist es in der Zeile meistens die 3. Zeichenkette mit ''. Außerdem wird nur in der 1. Zeile ersetzt, wo das Suchkriterium gefunden wird und nicht in allen Zeilen, wo das Suchkriterium vorkommt.
das verstehe ich nicht:
Hallo Jürgen, Sorry, ich hatte es mit meiner Datei probiert und nicht mit dem geposteten Beispiel. Meine Datei enthält Dinge, die ich nicht veröffentlichen kann. Ich werde aber mit meinem geposteten Beispiel probieren und versuchen herauszufinden, wo es dann bei meiner Datei hakt. Vielleicht gibt es da irgendwas in meinem Text, das Probleme macht. Vielen Dank! Αl -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um den Listen Administrator zu erreichen, schicken Sie eine Mail an: opensuse-de+owner@opensuse.org
Hallo, Am Fri, 31 Oct 2014, ?l ??gn?r schrieb:
@David, der awk-Befehl ist wirklich gruselig und ich verstehe ihn noch nicht. Aber ich probiere damit rum.
Es sind dreimal exakt der gleiche Befehl! Nur das Quoting variiert. Guck dir also als erstes die "HERE-Script" Version an, das ist die am einfachsten lesbare, da tauchen nur die Quotes auf, die es braucht (um die Strings/REs in awk): /suchkriterium/{ sub("'[^']+'", "'NEU'"); ^^^^^^^^^ ^^^^^^^ ups[1] | `--- Regex in "", "X[^X]+X", also das klassische "Zeichen X, dann mehrere Zeichen die nicht X sind, dann nochmal X". print; } [1] ich glaub da ist ein Fehler drin "NEU" soll ja die awk-Variable sein... Also ggfs.: "'" NEU "'" um die ' um die Variable "NEU" einzufügen. Oder man nimmt 'sprintf' (ungetestet): sub("'[^']+'", sprintf("'%s'", NEU)); Kann natürlich sein, daß du das für deinen konkreten Fall noch anpassen mußt ... HTH, -dnh -- Sigdashes are like condoms. They work better with a space at the end. -- David Scheidt -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um den Listen Administrator zu erreichen, schicken Sie eine Mail an: opensuse-de+owner@opensuse.org
Am Sat, 1 Nov 2014 00:19:49 +0100 schrieb David Haller <dnh@opensuse.org>: Hallo David,
Guck dir also als erstes die "HERE-Script" Version an
das habe ich vor, brauche aber etwas Zeit und weiß noch nicht, ob ich das vor oder nach dem Motherboard-Tausch machen werde, könnte kniffelig werden, wenn ich zuerst eine andere CPU wegen des Flashens verbauen muss. Danke auch dir! Αl -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um den Listen Administrator zu erreichen, schicken Sie eine Mail an: opensuse-de+owner@opensuse.org
participants (3)
-
David Haller
-
Dr. Juergen Vollmer
-
Аl Воgnеr