Hi, vielleicht hat jemand eine Idee/ Anregung für mich :) Folgendes Problem ( für RegEx Leute wohl ein Witz ): file.txt "String"\t+"String"\t+"String" "String1"\t+"String"\t+"String2" "String2"\t+"String2"\t+"String1" ... Das \t+ steht für min ein TAB, könne aber auch mehrere sein. Die Strings sind in " " eingeschlossen. Das 3-te String in jeder Zeile ist unbekannt. Nun möchte ich durch Aufruf etwa script.sh mit Parametern param1 param2 param3 das in der Datei nach den ersten 2 Parametern gesucht wird und wenn gefunden dann das 3-te String ausgetauscht wird. Also etwa so: rechner1 domain1 192.168.97.1 rechner2 domain2 192.168.14.2 rechner3 domain1 10.64.28.23 ./script.sh rechner2 domain2 10.64.16.4 rechner1 domain1 192.168.97.1 rechner2 domain2 10.64.16.4 rechner3 domain1 10.64.28.2 Pozdrawiam/Gruß/Regards Robert Rakowicz -- Robert Rakowicz E-Mail: Robert.Rakowicz@rjap.de URL: www.rjap.de
* Robert Rakowicz schrieb am 10.Mär.2002:
vielleicht hat jemand eine Idee/ Anregung für mich :) Folgendes Problem ( für RegEx Leute wohl ein Witz ):
file.txt "String"\t+"String"\t+"String" "String1"\t+"String"\t+"String2" "String2"\t+"String2"\t+"String1" ... Das \t+ steht für min ein TAB, könne aber auch mehrere sein. Die Strings sind in " " eingeschlossen.
Das 3-te String in jeder Zeile ist unbekannt. Nun möchte ich durch Aufruf etwa script.sh mit Parametern param1 param2 param3 das in der Datei nach den ersten 2 Parametern gesucht wird und wenn gefunden dann das 3-te String ausgetauscht wird. Also etwa so:
rechner1 domain1 192.168.97.1 rechner2 domain2 192.168.14.2 rechner3 domain1 10.64.28.23
./script.sh rechner2 domain2 10.64.16.4
rechner1 domain1 192.168.97.1 rechner2 domain2 10.64.16.4 rechner3 domain1 10.64.28.2
Sowas machst Du am Besten mit awk. Aber ist es notwendig, daß Du beide Parameter mitgibst? Ist doch ein wenig lestig. Bernd -- LILO funktioniert nicht? Hast Du /etc/lilo.conf verändert und vergessen, lilo aufzurufen? Ist Deine /boot-Partition unter der 1024 Zylindergrenze? Bei anderen LILO Problemen mal in der SDB nachschauen: http://localhost/doc/sdb/de/html/rb_bootdisk.html |Zufallssignatur 6
Hallo, Am Sonntag, 10. März 2002 15:01 schrieb Robert Rakowicz:
Das 3-te String in jeder Zeile ist unbekannt. Nun möchte ich durch Aufruf etwa script.sh mit Parametern param1 param2 param3 das in der Datei nach den ersten 2 Parametern gesucht wird und wenn gefunden dann das 3-te String ausgetauscht wird. Also etwa so:
rechner1 domain1 192.168.97.1 rechner2 domain2 192.168.14.2 rechner3 domain1 10.64.28.23
./script.sh rechner2 domain2 10.64.16.4
rechner1 domain1 192.168.97.1 rechner2 domain2 10.64.16.4 rechner3 domain1 10.64.28.2
Zum Beispiel mit `awk'. Als Shellskript sieht das dann ein wenig
kompiliziert aus:
--------script.sh--------
#!/bin/sh
awk '
BEGIN { FS="\t+" }
$1 ~ /'"$1"'/ && $2 ~ /'"$2"'/ {
print substr( $0, 1, index( $0, $3) - 1) "'"$3"'"
next
}
{ print }'
-------------------------
Es gibt eleganter aussehende Lösungen, wenn Du zum Beispiel
darauf verzichtest, daß die Anzahl von Zwischen-Tabs
gleichbleiben muß.
--------script.sh--------
#!/bin/sh
awk '
BEGIN { FS="\t+" ; OFS="\t" }
$1 ~ /'"$1"'/ && $2 ~ /'"$2"'/ { $3 = "'"$3"'"}
{ print }'
-------------------------
Usw., uwf.
Gruß
Bertram
--
Bertram Scharpf
Hallo, Am Sonntag, 10. März 2002 15:01 schrieb Robert Rakowicz:
Das 3-te String in jeder Zeile ist unbekannt. Nun möchte ich durch Aufruf etwa script.sh mit Parametern param1 param2 param3 das in der Datei nach den ersten 2 Parametern gesucht wird und wenn gefunden dann das 3-te String ausgetauscht wird. Also etwa so:
rechner1 domain1 192.168.97.1 rechner2 domain2 192.168.14.2 rechner3 domain1 10.64.28.23
./script.sh rechner2 domain2 10.64.16.4
rechner1 domain1 192.168.97.1 rechner2 domain2 10.64.16.4 rechner3 domain1 10.64.28.2
Zum Beispiel mit `sed'. Was hier als "·" (centered dot) steht,
gibst Du mit Strg-V, TAB ein.
sed "/rechner2·\+domain2·\+/s/·[^·]*$/·10.64.16.4/"
(Warum der Rückstrich vor dem Plus stehen muß, weiß
ich nicht...)
Usw., uwf.
Gruß
Bertram
--
Bertram Scharpf
* On Sun, 10 Mar 2002 at 18:08 +0100, Bertram Scharpf wrote: [RegEx]
sed "/rechner2·\+domain2·\+/s/·[^·]*$/·10.64.16.4/"
(Warum der Rückstrich vor dem Plus stehen muß, weiß ich nicht...)
Weil + in der gleichen Liga wie * oder ? spielt. -- Adalbert PGP welcome, request public key: mailto:adalbert+key@lopez.at
Hallo, Am Sonntag, 10. März 2002 22:27 schrieb Adalbert Michelic:
* On Sun, 10 Mar 2002 at 18:08 +0100, Bertram Scharpf wrote: [RegEx]
sed "/rechner2·\+domain2·\+/s/·[^·]*$/·10.64.16.4/"
(Warum der Rückstrich vor dem Plus stehen muß, weiß ich nicht...)
Weil + in der gleichen Liga wie * oder ? spielt.
'Tschuldiging, glaub' ich nicht. Ich nehme eine beliebige
Textdatei; der Buchstabe "s" ist nicht allzu selten. Ich
rufe auf:
$ sed -n "/s+/p" datei_mit_s_drin | less # (1)
$ sed -n "/ss*/p" datei_mit_s_drin | less # (2)
$ sed -n "/s\+/p" datei_mit_s+_drin | less # (3)
(1) liefert garnichts, (2) liefert alles mit mindestestens
/einem/ "s". (3) liefert alles mit "s+" (literally) drin.
Das Plus ("+") muß wohl doch eine gesonderte Rolle spielen
in der bash-Kommandozeile. Ein ähnliches Verhalten ist mir
schon bei "!" aufgefallen, wofür ich aber eine Erklärung
gefunden habe.
Gruß
Bertram
--
Bertram Scharpf
Moin Bertram, * Bertram Scharpf schrieb am 11 Mar 2002:
Am Sonntag, 10. März 2002 22:27 schrieb Adalbert Michelic:
* On Sun, 10 Mar 2002 at 18:08 +0100, Bertram Scharpf wrote: [RegEx]
sed "/rechner2·\+domain2·\+/s/·[^·]*$/·10.64.16.4/"
(Warum der Rückstrich vor dem Plus stehen muß, weiß ich nicht...)
Weil + in der gleichen Liga wie * oder ? spielt.
'Tschuldiging, glaub' ich nicht. Ich nehme eine beliebige Textdatei; der Buchstabe "s" ist nicht allzu selten. Ich rufe auf:
$ sed -n "/s+/p" datei_mit_s_drin | less # (1) $ sed -n "/ss*/p" datei_mit_s_drin | less # (2) $ sed -n "/s\+/p" datei_mit_s+_drin | less # (3)
(1) liefert garnichts, (2) liefert alles mit mindestestens /einem/ "s". (3) liefert alles mit "s+" (literally) drin.
Das Plus ("+") muß wohl doch eine gesonderte Rolle spielen in der bash-Kommandozeile. Ein ähnliches Verhalten ist mir schon bei "!" aufgefallen, wofür ich aber eine Erklärung gefunden habe.
! ist ein bash-Special, das ist richtig. Aber das + ist nur eine Eigenart von sed, das ist - zumindest bei den mir bekannten Versionen - eben so. *, ?, \+ Gruß, Sebastian -- Do not meddle in the affairs of sysadmins, for they are subtle and quick to anger. Sebastian Helms - http://www.helms.sh - mailto:mail@helms.sh (PGP welcome) SuSE-Linux-Mailinglisten-FAQ: http://www.helms.sh/faq/
Hi! On Sun, 10 Mar 2002, Adalbert Michelic wrote:
* On Sun, 10 Mar 2002 at 18:08 +0100, Bertram Scharpf wrote: [RegEx]
sed "/rechner2·\+domain2·\+/s/·[^·]*$/·10.64.16.4/"
(Warum der Rückstrich vor dem Plus stehen muß, weiß ich nicht...)
Weil + in der gleichen Liga wie * oder ? spielt.
Oder eher in der gleichen Liga wie "(" und ")" (in sed)? "c\+" steht für "mindestens ein c", im Gegenstz zu "c*", das für "Null oder mehr c" steht. Manche Operatoren müssen offenbar mit "\" gequoted werden, damit sie ihre Sonderbedeutung bekommen - also genau umgekehrt wie sonst! :-( Hat hier irgendjemand einen Pointer auf eine ausführliche Doku der Regular-Expression-Syntax, die sed versteht? In der Info-Datei wird auf awk verwiesen, aber da scheint es doch Unterschiede zu geben... :-(( Martin
Hallo, Am Montag, 11. März 2002 12:22 schrieb Martin Köhling:
On Sun, 10 Mar 2002, Adalbert Michelic wrote:
* On Sun, 10 Mar 2002 at 18:08 +0100, Bertram Scharpf wrote: [RegEx]
sed "/rechner2·\+domain2·\+/s/·[^·]*$/·10.64.16.4/"
(Warum der Rückstrich vor dem Plus stehen muß, weiß ich nicht...)
Weil + in der gleichen Liga wie * oder ? spielt.
Oder eher in der gleichen Liga wie "(" und ")" (in sed)?
"c\+" steht für "mindestens ein c", im Gegenstz zu "c*", das für "Null oder mehr c" steht.
Manche Operatoren müssen offenbar mit "\" gequoted werden, damit sie ihre Sonderbedeutung bekommen - also genau umgekehrt wie sonst! :-(
Sicher ist: an der `bash' liegt's nicht. Das habe ich überprüft. `sed' braucht eben den Rückstrich vor dem Plus, ähnlich wie `grep' und `egrep' mal "\(" und mal "(" brauchen. In `awk' muß das "+" nicht gequotet werden.
Hat hier irgendjemand einen Pointer auf eine ausführliche Doku der Regular-Expression-Syntax, die sed versteht? In der Info-Datei wird auf awk verwiesen, aber da scheint es doch Unterschiede zu geben... :-((
Ich kann nur schon wieder empfehlen: "sed & awk, _kurz & gut_"
von O'Reilly (8,- Euro). Auf Seite 10 steht eine Tabelle. Die
Spalten heißen: "Symbol", "sed/grep", "awk/egrep". Die Zeilen:
"\( \)", "\{ \}", "\< \>", "( )" und, siehe da: auch "+". Es
fehlt "\+", aber man kann ja nicht immer alles haben ...
Gruß
Bertram
--
Bertram Scharpf
Hi! On Mon, 11 Mar 2002, Bertram Scharpf wrote:
`sed' braucht eben den Rückstrich vor dem Plus, ähnlich wie `grep' und `egrep' mal "\(" und mal "(" brauchen. In `awk' muß das "+" nicht gequotet werden.
Ebend... :-)
Hat hier irgendjemand einen Pointer auf eine ausführliche Doku der Regular-Expression-Syntax, die sed versteht? In der Info-Datei wird auf awk verwiesen, aber da scheint es doch Unterschiede zu geben... :-((
Ich kann nur schon wieder empfehlen: "sed & awk, _kurz & gut_" von O'Reilly (8,- Euro). Auf Seite 10 steht eine Tabelle. Die Spalten heißen: "Symbol", "sed/grep", "awk/egrep". Die Zeilen: "\( \)", "\{ \}", "\< \>", "( )" und, siehe da: auch "+". Es fehlt "\+", aber man kann ja nicht immer alles haben ...
Danke - klingt nach einem guten Tip! Martin
Moin Martin, * Martin Köhling schrieb am 11 Mar 2002:
"c\+" steht für "mindestens ein c", im Gegenstz zu "c*", das für "Null oder mehr c" steht.
Manche Operatoren müssen offenbar mit "\" gequoted werden, damit sie ihre Sonderbedeutung bekommen - also genau umgekehrt wie sonst! :-(
Hat hier irgendjemand einen Pointer auf eine ausführliche Doku der Regular-Expression-Syntax, die sed versteht? In der Info-Datei wird auf awk verwiesen, aber da scheint es doch Unterschiede zu geben... :-((
Ja, für Hardcore-Regex'er: Jeffrey E.F. Friedl Mastering Regular Expressions O'Reilly gibts afaik auch auf deutsch. Gruß, Sebastian -- Do not meddle in the affairs of sysadmins, for they are subtle and quick to anger. Sebastian Helms - http://www.helms.sh - mailto:mail@helms.sh (PGP welcome) SuSE-Linux-Mailinglisten-FAQ: http://www.helms.sh/faq/
participants (6)
-
Adalbert Michelic
-
B.Brodesser@t-online.de
-
Bertram Scharpf
-
Martin Köhling
-
Robert Rakowicz
-
Sebastian Helms