Suchen und Ersetzen mit einem Bash.-Script
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 -- 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 Thu, 30 Oct 2014, ?l ??gn?r schrieb:
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.
awk -vNEU="$neu" "/suchkriterium/{ sub(\"'[^']+'\", \"'neu'\"); print; }" "$TEXTDATEI" Andersrum zu quoten wird noch gruseliger: awk -vNEU="$neu" '/suchkriterium/{ sub("'"'"'[^'"'"']+'"'"'", "'"'"'neu'"'"'"); print; }' "$TEXTDATEI" Einfach hingegen, wenn man den awk-Teil als eigens awk-script oder here-Datei speichert. awk -vNEU="foo" -f- "$TEXTDATEI" <<'EOF' /suchkriterium/{ sub("'[^']+'", "'neu'"); print; } EOF HTH, -dnh -- RAID: Es geht immer genau eine Platte mehr kaputt als durch die Redundanz aufgefangen werden könnte. -- Andreas Dau -- 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 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 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 12:29:48 +0100
schrieb Dr. Jürgen Vollmer
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 -- 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 Freitag 31 Oktober 2014, 13:04:04 schrieben Sie:
Am Fri, 31 Oct 2014 12:29:48 +0100 schrieb Dr. Jürgen Vollmer
: 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" 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 -------------------------------------------------------------------------------
Hallo, Am Fri, 31 Oct 2014, David Haller schrieb:
awk -vNEU="$neu" "/suchkriterium/{ sub(\"'[^']+'\", \"'neu'\"); print; }" "$TEXTDATEI"
Andersrum zu quoten wird noch gruseliger:
awk -vNEU="$neu" '/suchkriterium/{ sub("'"'"'[^'"'"']+'"'"'", "'"'"'neu'"'"'"); print; }' "$TEXTDATEI"
Einfach hingegen, wenn man den awk-Teil als eigens awk-script oder here-Datei speichert.
awk -vNEU="foo" -f- "$TEXTDATEI" <<'EOF' /suchkriterium/{ sub("'[^']+'", "'neu'"); print; } EOF
*ARGS* Hier muß natürlich im awk-script jew. "NEU" statt "neu" stehen, also im letzten (korrigierten) Fall: awk -vNEU="foo" -f- "$TEXTDATEI" <<'EOF' /suchkriterium/{ sub("'[^']+'", "'" NEU "'"); print; } EOF Oder so ;) -dnh -- 16: SYSOP Vollidiot (Courtesy of Christian Weisgerber) -- 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 (4)
-
David Haller
-
Dr. Juergen Vollmer
-
Dr. Jürgen Vollmer
-
Аl Воgnеr