Klara: MAC Adresse mit sed durch ein * ersetzen

Hi!

Warum funktioniert folgendes nicht?
echo 'SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:0d:34:26:ec:1e", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"' |sed 's/".*:.*:.*:.*:.*:.*"/bla/g'

ich möchte eigentlich folgendes zurück bekommen
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="*", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"

Klara

  1. Hi!

    Warum funktioniert folgendes nicht?
    echo 'SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:0d:34:26:ec:1e", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"' |sed 's/".*:.*:.*:.*:.*:.*"/bla/g'

    Sicher, dass in der MAC-Addr Doppelpunkte sind?

    Hotti

    --
    Wenn der Kommentar nicht zum Code passt, kann auch der Code falsch sein.
    1. Hi!

      Warum funktioniert folgendes nicht?
      echo 'SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:0d:34:26:ec:1e", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"' |sed 's/".*:.*:.*:.*:.*:.*"/bla/g'

      Sicher, dass in der MAC-Addr Doppelpunkte sind?

      ja, das steht so in der Datei /etc/udev/rules.d/70-persistent-net.rules (OpenSUSE 11.1)

      ifconfig gibt die Doppelpunkte auch aus
      scar:~ # ifconfig
      eth0      Link encap:Ethernet  HWaddr 00:0d:34:26:ec:1e
                inet addr:10.9.8.7  Bcast:10.9.8.255  Mask:255.255.255.0
                inet6 addr: fe80::20c:29ff:fec5:dc1a/64 Scope:Link
                UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
                RX packets:1092 errors:0 dropped:0 overruns:0 frame:0
                TX packets:482 errors:0 dropped:0 overruns:0 carrier:0
                collisions:0 txqueuelen:1000
                RX bytes:182490 (178.2 Kb)  TX bytes:89328 (87.2 Kb)

      lo        Link encap:Local Loopback
                inet addr:127.0.0.1  Mask:255.0.0.0
                inet6 addr: ::1/128 Scope:Host
                UP LOOPBACK RUNNING  MTU:16436  Metric:1
                RX packets:326 errors:0 dropped:0 overruns:0 frame:0
                TX packets:326 errors:0 dropped:0 overruns:0 carrier:0
                collisions:0 txqueuelen:0
                RX bytes:153681 (150.0 Kb)  TX bytes:153681 (150.0 Kb)

      Klara

  2. Hi!

    Warum funktioniert folgendes nicht?
    echo 'SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:0d:34:26:ec:1e", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"' |sed 's/".*:.*:.*:.*:.*:.*"/bla/g'

    ich möchte eigentlich folgendes zurück bekommen
    SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="*", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"

    warum wird beim zweiten Aufruf von sed die Ersetzung nicht durchgeführt?

    susi:~ # cp -a /etc/udev/rules.d/{70-persistent-net.rules,70-persistent-net.rules.bak}
    susi:~ # search=grep eth0 /etc/udev/rules.d/70-persistent-net.rules
    susi:~ # replace=echo ${search} |sed -r 's/([0-9a-f]{2}:){5}[0-9a-f]{2}/\*/'
    susi:~ # echo ${search}
    SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:0d:34:26:ec:1e", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"
    susi:~ # echo ${replace}
    SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="*", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"
    susi:~ # sed -i "s/${search}/${replace}/g" /etc/udev/rules.d/70-persistent-net.rules
    susi:~ # grep eth0  /etc/udev/rules.d/70-persistent-net.rules*
    /etc/udev/rules.d/70-persistent-net.rules:SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:0d:34:26:ec:1e", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"
    /etc/udev/rules.d/70-persistent-net.rules.bak:SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:0d:34:26:ec:1e", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"

    Klara

    1. Heißa, Karla,

      susi:~ # sed -i "s/${search}/${replace}/g" /etc/udev/rules.d/70-persistent-net.rules

      Sollte das nicht -e heißen? -i macht etwas ganz anderes, laut der Man-Page hier. Darüberhinaus dürfte es Probleme geben mit den geschweiften Klammern und Fragezeichen und so weiter in deinen beiden Strings, da diese ja in regulären Ausdrücken eine besondere Bedeutung haben.
      Besser wär’s, die ganze Ersetzung in nur einem sed-Befehl durchzuführen, zum Beispiel, indem du ihn so erweiterst (ungetestet):
      sed -r 's/([0-9a-f]{2}:){5}[0-9a-f]{2}(.*eth0)/*\2/'`
      Dadurch werden nur noch Zeilen gematcht, in denen das eth0 weiter hinten steht, und die zweite Klammer wird mithilfe des \2 wieder an den Ersatzstring drangehängt, sodass sich dort nichts verändert.

      Gautera!
      Grüße aus Biberach Riss,
      Candid Dauth

      --
      „Soggt da Duaschd zum Hunga:
      ‚I hob heid noh niggs drunga.‘
      Do soggt da Hunga zum Duaschd:
      ‚Woaßt wos? Dehs is mia wuaschd!‘“
  3. Heißa, Klara,

    Warum funktioniert folgendes nicht?
    echo 'SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:0d:34:26:ec:1e", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"' |sed 's/".*:.*:.*:.*:.*:.*"/bla/g'

    Weil das Anführungszeichen in deinem regulären Ausdruck das erste nimmt, was es findet (also das nach SUBSYSTEM=), denn alles bis zum ersten Doppelpunkt trifft ja auf die Beschreibung .* zu. Ebenso alles nach dem letzten Doppelpunkt bis zum letzten Anführungszeichen, auch das passt auf die Beschreibung .*. Die Lösung ist, die Beschreibung der einzelnen Teile der Mac-Adresse so weit zu spezialisieren, dass sie nur noch die tatsächliche Mac-Adresse matcht und nicht mehr den Rest, zum Beispiel, indem du das .* durch ein [0-9a-f]{2} ersetzt, oder was auch immer alles für Werte bei dir herauskommen können.

    Gautera!
    Grüße aus Biberach Riss,
    Candid Dauth

    --
    „Soggt da Duaschd zum Hunga:
    ‚I hob heid noh niggs drunga.‘
    Do soggt da Hunga zum Duaschd:
    ‚Woaßt wos? Dehs is mia wuaschd!‘“
    1. Hallo

      Warum funktioniert folgendes nicht?
      echo 'SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:0d:34:26:ec:1e", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"' |sed 's/".*:.*:.*:.*:.*:.*"/bla/g'

      Weil das Anführungszeichen in deinem regulären Ausdruck das erste nimmt, was es findet (also das nach SUBSYSTEM=), denn alles bis zum ersten Doppelpunkt trifft ja auf die Beschreibung .* zu. Ebenso alles nach dem letzten Doppelpunkt bis zum letzten Anführungszeichen, auch das passt auf die Beschreibung .*. Die Lösung ist, die Beschreibung der einzelnen Teile der Mac-Adresse so weit zu spezialisieren, dass sie nur noch die tatsächliche Mac-Adresse matcht und nicht mehr den Rest, zum Beispiel, indem du das .* durch ein [0-9a-f]{2} ersetzt, oder was auch immer alles für Werte bei dir herauskommen können.

      ok, das ist mir jetzt soweit Klar

      warum funktioniert folgender Versuch nicht?

      Klara